0

对于给定的存储库接口IRepository<T> where T: Base和一堆继承Base(例如,Text)的类,您如何创建实现的提供者IRepository的实例,例如JsonRepository<T>使用TextasT (JsonRepository<Text>)并在其上运行方法?

我想使用反射forforeach为所有继承的类创建存储库实例Base并在它们上执行一些数据管理功能。

我想避免的 - 如果你有 100 个继承Base类的类,你显然不会在代码中手动创建实例然后运行它?

4

3 回答 3

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 回答
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 回答
-1

您当前使用的是泛型约束,但为什么不使用表示泛型类型具有公共无参数 ctor 的“新”约束,即

IRepository<T> where T: Base, new

这意味着您可以致电:

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

现在你如何应用它可能是通过一个基本的抽象类,或者你可以简单地通过一个propfull返回rep实例......这取决于你。

我不得不承认你的问题有点模糊,所以如果这不是你想要的,请原谅。

于 2012-05-14T18:07:36.753 回答