1

私はこのドメインを持っています:

public class GenClass<T> { }

public class Type1 { }

public class Type2 { }

public class GenType1 : GenClass<Type1> { }

public class GenType2 : GenClass<Type1> { }

public class GenType3 : GenClass<Type2> { }

public class GenType4 : GenClass<string> { } 

public class GenType5 : GenClass<int> { } 

そしてこのロジック:

public class SomeClass {
    public void Add<T>(GenClass<T> t) { }
}

そしてこの消費者:

public class Consumer {
    public void Method() {
        var some = new SomeClass();
        some.Add(new GenType1());
        some.Add(new GenType2());
        some.Add(new GenType3());
        some.Add(new GenType4());
        some.Add(new GenType5());
    }
}

ただし、それぞれを個別に追加する代わりにGenType(n)、次のようなメソッドを作成します。

public void AddFromAssembly<TAssembly>(SomeClass some, Type baseType) {
    var list = typeof(TAssembly).Assembly.GetTypes()
        .Where(t => baseType.IsAssignableFrom(t)
            && !baseType.Equals(t))
        .ToList();
    list.ForEach(type => {
        var ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null,
                                       Type.EmptyTypes, null);
        var obj = ctor.Invoke(new object[] { });
        some.Add(obj); //????
    });
}

次のように呼び出したい:

public class Consumer {
    public void Method() {
        var some = new SomeClass();
        AddFromAssembly<GenType1>(some, typeof(GenClass<>));
    }
}

しかし、some.Addメソッドはジェネリック メソッドであり、ctor.Invokeメソッドはobject. この問題を解決するアイデアはありますか? 前もって感謝します。

更新質問が不完全でした。修正します。レビューありがとうございます。

4

2 に答える 2

7

次のいずれかを行います。

Add<object>(obj); //this will work with T typed as object

また:

typeof(Some).GetMethod("Add").MakeGenericMethod(new [] { typeof(obj.GetType()).Invoke(some, new [] { obj });

リフレクション バージョンは、実行時に T の正確なタイプの obj を使用します。

于 2012-05-03T18:12:13.073 に答える
1

ジェネリックへの型パラメーターはコンパイル時間が必要であり、実行時に決定することはできません (実行時にクラス定義を作成する手間をかけたくない場合を除きます)。

おそらく行う必要があるのは、「オブジェクト」に対して型指定されたメソッドの 2 番目のバージョンを作成し、代わりにそれを使用することです。

于 2012-05-03T18:05:15.950 に答える