0

特定のリポジトリ インターフェイスIRepository<T> where T: Baseと継承する一連のクラスBase(たとえば、 ) に対して、たとえばasを使用して を実装し、その上でメソッドを実行するプロバイダーのインスタンスをText作成するにはどうすればよいでしょうか?IRepositoryJsonRepository<T>TextT (JsonRepository<Text>)

fororでリフレクションを使用して、foreach継承するすべてのクラスのリポジトリのインスタンスを作成しBase、それらに対していくつかのデータ管理機能を実行したいと思います。

私が避けたいこと-クラスを継承するBaseクラスが100個ある場合、明らかにコードでインスタンスを手動で作成して実行することはありませんか?

4

3 に答える 3

0

@SwDevMan81の助けといくつかの反省により、これをハックすることができ、実際には完全に機能します。

var type = typeof(Base);
var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
        .SelectMany(s => s.GetTypes())
        .Where(p => type.IsAssignableFrom(p));

var jsonProviderClass = typeof(JsonContentProvider<>);
var xmlProviderClass = typeof(XmlContentProvider<>);

    foreach (var t in types) {
        Type[] typeArgs = { t };
        // get XML provider
        var xmlGenericProvider = xmlProviderClass.MakeGenericType(typeArgs);
        object xmlProvider = Activator.CreateInstance(xmlGenericProvider);
        // get JSON provider
        var jsonGenericProvider = jsonProviderClass.MakeGenericType(typeArgs);
        object jsonProvider = Activator.CreateInstance(jsonGenericProvider);
        // methods to run
        MethodInfo xmlMethod = xmlGenericProvider.GetMethod("GetContent", new Type[] { typeof(string) });
        MethodInfo jsonMethod = jsonGenericProvider.GetMethod("Update");
        // get content from XML provider
        var result = xmlMethod.Invoke(xmlProvider, new object[] { string.Empty });
        // enumerate XML content items
        foreach (var item in ((IEnumerable)result)) {
            // update them via JSON provider
            object[] parametersArray = new object[] { item };
            var update = jsonMethod.Invoke(jsonProvider, parametersArray);
        }
    }
于 2012-05-14T21:41:58.837 に答える
0

使用できますActivator.CreateInstance

ここで例を参照してください:

あなたの例に変更:

var d1 = typeof(JsonRepository<>);
Type[] typeArgs = { typeof(Text) };
var makeme = d1.MakeGenericType(typeArgs);
object o = Activator.CreateInstance(makeme);
于 2012-05-14T17:55:19.683 に答える
-1

現在、ジェネリック制約を使用していますが、ジェネリック型がパラメーターなしの public ctor を持っていることを示す「新しい」制約を使用しないのはなぜですか

IRepository<T> where T: Base, new

つまり、次のように呼び出すことができます。

abstract class ctor()
{
    IRepository rep = new T();
}

これをどのように適用するかは、基本抽象クラスを使用するか、propfull を使用して単純に rep インスタンスを返すことができます...それはあなた次第です。

あなたの質問が少しあいまいであることを認めなければなりません。

于 2012-05-14T18:07:36.753 に答える