実行時に、既存のインターフェイスと同じメンバをすべて使用して、新しいインターフェイスを生成する必要があります。属性パラメータは実行時まで認識されません)。どのように達成することができますか?.NETのReflection.Emitを使用してインターフェイスを生成する
7
A
答えて
8
あなたの質問はあまり具体的ではありません。より多くの情報でそれを更新するならば、私はこの答えをさらに細かく説明します。
ここでは、手動の手順の概要を示します。
- DefineDynamicAssembly とアセンブリを作成
- DefineTypeとタイプを作成DefineDynamicModule
- でモジュールを作成します。あなたのタイプをインターフェースにするには、
TypeAttributes.Interface
を必ず渡してください。 - 元のインターフェイスのメンバーを繰り返し処理し、新しいインターフェイスで同様のメソッドを構築し、必要に応じて属性を適用します。
TypeBuilder.CreateType
を呼び出して、インターフェイスの構築を完了します。動的属性を持つインターフェイスでアセンブリを作成するには
12
:
using System.Reflection;
using System.Reflection.Emit;
// Need the output the assembly to a specific directory
string outputdir = "F:\\tmp\\";
string fname = "Hello.World.dll";
// Define the assembly name
AssemblyName bAssemblyName = new AssemblyName();
bAssemblyName.Name = "Hello.World";
bAssemblyName.Version = new system.Version(1,2,3,4);
// Define the new assembly and module
AssemblyBuilder bAssembly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(bAssemblyName, AssemblyBuilderAccess.Save, outputdir);
ModuleBuilder bModule = bAssembly.DefineDynamicModule(fname, true);
TypeBuilder tInterface = bModule.DefineType("IFoo", TypeAttributes.Interface | TypeAttributes.Public);
ConstructorInfo con = typeof(FunAttribute).GetConstructor(new Type[] { typeof(string) });
CustomAttributeBuilder cab = new CustomAttributeBuilder(con, new object[] { "Hello" });
tInterface.SetCustomAttribute(cab);
Type tInt = tInterface.CreateType();
bAssembly.Save(fname);
次を作成します。
namespace Hello.World
{
[Fun("Hello")]
public interface IFoo
{}
}
方法TypeBuilder.DefineMethodを呼び出すことにより、MethodBuilderクラスを使用の追加。
関連する問題
- 1. Explicitインターフェイスの実装とReflection.Emit
- 2. .NETアプリケーションのテンプレートを使用してHTMLを生成する
- 3. Reflection.Emitを使用して多次元配列を作成する方法
- 4. Reflection.Emitを使用してネストされた型を作成する方法
- 5. Reflection.Emitを使用してコードを生成し、生成されたコードを.csファイルに保存できますか、CodeDomを使用できますか?
- 6. 私はReflection.Emit(TypeBuilder)を使用してこのパターンを実装しようとしているReflection.Emit
- 7. C#.NETを使用したPDF生成
- 8. Reflection.Emitを使用したExpression.Convertと同等
- 9. PHPインターフェイスを生成する
- 10. .NETアプリケーションでPhantom JSを使用してPDFを生成
- 11. Reflection.Emitを使用して別のオブジェクトからプロパティ値を取得
- 12. .NETを使用してセマンティックhtmlを生成するためのアドバイス
- 13. .NETでReflection.Emitを使用してハードコーディングされた既存のメソッドを呼び出す
- 14. 生成された波形データを使用して.NETでサウンドを再生
- 15. ctagsを使用して.netライブラリ(c#)からタグファイルを生成する
- 16. Visual Studio 2008を使用して.netモジュールを生成する方法
- 17. .NET - あなたはインターフェイスを越えてできますか?そしてインターフェイスを使用しない場合は
- 18. Reflection.Emitの型パラメータとしての放射型の使用
- 19. PHPUnit - インターフェイスのテストクラスを作成し、ファクトリを使用してオブジェクトをテストする
- 20. 別のインターフェイスでインターフェイスを使用する
- 21. 異なるインターフェイスを使用してWebサービスを使用する
- 22. Reflection.Emitとxsdファイルを使用してデータベーステーブルからクラスを生成する際に予想される落とし穴を教えてください。
- 23. .NETを使用して手描きのエフェクトを作成する
- 24. .NETを使用して100,000のTCP接続を作成する
- 25. .NET構成データ型でリフレクションを使用して動的に生成された構成UIを構築する
- 26. xsdを使って.netでXMLを生成する
- 27. SVCUTIL.EXEを使用してNOAA Forcast用のDataContractsを生成する
- 28. SQLMetalを使用して.dbmlを生成
- 29. XPathを使用してXPathを生成
- 30. AS3を使用してムービーファイルを生成
ナー、それはクールです。 Reflection.Emitを使う必要はありませんでしたので、誰かが私の邪悪なマスタープランにつまずくブロックを見つけられるかどうかを見たいと思っていました。 –