我有一个方法,根据我传入参数的某些类型检索一些数据,如下所示:
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指令或程序集引用?)
我尝试过中间对象类型,但没有成功
有什么想法吗?
答案 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);
动态类型基本上是在做其他答案给你看到的 - 但恕我直言这个代码的意图更整洁,更清晰。