动态地将Type传递给Method <t> </t>

时间:2013-05-02 12:58:55

标签: linq entity-framework generics parameter-passing dynamically-generated

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

    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 个答案:

答案 0 :(得分: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]);

答案 1 :(得分: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);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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

动态类型基本上是在做其他答案给你看到的 - 但恕我直言这个代码的意图更整洁,更清晰。