3

参照されている dll から型を解決するための戦略があります。コンパイル中のアセンブリで定義されている型を解決しようとして困っています。サードパーティのライブラリを使用せずに System.Reflection.Emit API を使用しています。

例えば:

class A {}
class B
{
    public A AnInstanceOfA {get; private set;}
}

B の A の参照を解決する最善の方法は何ですか?

これはどうですか:

class A
{
    B AnInstanceOfB {get; set;}
}
class B
{
    A AnInstanceOfA {get; set;}
}

クラスには互いのインスタンスが含まれています。

これを行うためのベストプラクティスの方法はありますか? 実装すべき設計パターンはありますか? System.Reflection.Emit ライブラリのみを使用することをお勧めしますが、これを行うためのより良い方法がある場合、またはそれらでこれを行うことができない場合は、他のライブラリを使用してもかまいません。

ありがとう

4

1 に答える 1

3

発生している問題について詳しく説明していただけますか (おそらく、コードに、機能していないコードの小さな例を示してください)。TypeBuilderから派生しているためType、相互に再帰的な型を定義しようとしている場合はTypeBuilder、型を参照したい場所ならどこでも 2 つの を渡すことができます。

編集

タイプを「解決」する必要はありません。それぞれのにアクセスでき、TypeBuilder完全に定義された型であるかのように使用できます。更新でリクエストしたコードを生成する例を次に示します。

private void DefineAutoProp(string name, Type t, TypeBuilder tb)
{
    var fldName = name.Substring(0, 1).ToLower() + name.Substring(1);
    var fld = tb.DefineField(fldName, t, FieldAttributes.Private);
    var prop = tb.DefineProperty(name, PropertyAttributes.None, t, null);
    var getter = tb.DefineMethod("get_" + name, MethodAttributes.Public, t, null);
    var ilg = getter.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldfld, fld);
    ilg.Emit(OpCodes.Ret);
    var setter = tb.DefineMethod("set_" + name, MethodAttributes.Public, typeof(void), new[] { t });
    ilg = setter.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldarg_1);
    ilg.Emit(OpCodes.Stfld, fld);
    ilg.Emit(OpCodes.Ret);
    prop.SetGetMethod(getter);
    prop.SetSetMethod(setter);
}

public void DefineTypes()
{
    var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("test"), AssemblyBuilderAccess.Run);
    var mb = ab.DefineDynamicModule("test");
    var A = mb.DefineType("A", TypeAttributes.Public | TypeAttributes.Class);
    var B = mb.DefineType("B", TypeAttributes.Public | TypeAttributes.Class);
    DefineAutoProp("AnInstanceOfA", A, B);
    DefineAutoProp("AnInstanceOfB", B, A);
    A.CreateType();
    B.CreateType();
}
于 2010-02-10T15:16:50.613 に答える