2

我有一个方法,它根据我传入参数的某种类型向我检索一些数据,如下所示:

    protected void FillList<TEntity>()
    {
        doWorkForTEntity();
    }

我需要动态调用这个方法:

            Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes();
            Type currentEntity = (from entity in entities
                                  where entity.Name.Equals(this.targetEntity)
                                  select entity).FirstOrDefault();
            FillList<currentEntity>();

我收到了这个错误:

找不到类型或命名空间名称“currentEntity”(您是否缺少 using 指令或程序集引用?)

我尝试了一个中间对象类型,没有成功

请问有什么想法吗?

4

4 回答 4

2

由于编译时没有实体类型的信息,所以需要通过反射构造并调用相应的方法:

Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes();
Type currentEntity = (from entity in entities
                      where entity.Name.Equals(this.targetEntity)
                      select entity).FirstOrDefault();     
var method = this.GetType().GetMethod("FillList",  BindingFlags.Instance | BindingFlags.NonPublic)
                           .MakeGenericMethod(currentEntity);
method.Invoke(this, new object[0]);
于 2013-05-02T13:05:07.150 回答
1

您还需要使用反射来做到这一点,因此它不会在编译时失败(编译器检查):

通用类:

Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes();
Type currentEntity = (from entity in entities
                           where entity.Name.Equals(this.targetEntity)
                           select entity).FirstOrDefault();
 Type fillListType= typeof(FillList<>);
 Type constructedGenericClass = fillListType.MakeGenericType(currentEntity);
 object myList = Activator.CreateInstance(constructedGenericClass );

通用方法:

Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes();
Type currentEntity = (from entity in entities
                           where entity.Name.Equals(this.targetEntity)
                           select entity).FirstOrDefault();
MethodInfo methodinfo = this.GetType().GetMethod("FillList");
MethodInfo genericMethod = method.MakeGenericMethod(currentEntity);
genericMethod.Invoke(this, null);
于 2013-05-02T13:02:10.520 回答
0

类型参数必须在编译时指定,并且不能像在您的示例中那样在运行时分配。您收到错误消息是因为没有调用类型,currentEntiry因为它只是一个变量。

于 2013-05-02T13:02:56.720 回答
0

更改您的方法以获取 Type TEntity 的实例:

protected void FillList<TEntity>(TEntity instance)
{
    doWorkForTEntity();
}

从 Type 名称创建一个动态实例,然后调用修改后的方法:

dynamic instance = Activator.CreateInstance(this.targetEntity);
FillList(instance);

动态类型基本上是在做其他答案向您展示的事情 - 但恕我直言,这段代码的意图更简洁明了。

于 2013-05-02T14:36:05.170 回答