Ienumerable of T,T仅在运行时可用
Ienumerable of T, T is only available at runtime
我有一个带有此签名的方法
public IEnumerable<T> GetAll<T>() where T : new()
{
// Orm Lite Version
return Connection.LoadSelect<T>();
}
编译时我不知道类型 T。我只知道运行时的 class 名称是否可以使用类似这样的反射来调用此方法?
string TargetTBLName = ...;//TargetTBLName get's it's value at runtime
Type ParentTableClass = Type.GetType(TargetTBLName);
IEnumerable<Type.GetType(TargetTBLName)> test = Repository.GetAll<Type.GetType(TargetTBLName)>();
有什么想法吗?
我想试一试 Dynamitey 图书馆。您可以通过多种不同的方式做到这一点,但我更喜欢这种方式,因为它很简单。你可以找到它 here.
var name = InvokeMemberName.Create;
var test = Dynamic.InvokeMember(Repository, name("GetAll", new[]{ParentTableClass }));
foreach(var obj in test)
{
obj.SomeMethodFromMyType();
}
请记住,如果 Repository
是静态的,那么您必须稍微调整一下才能使用静态调用上下文(查找 link)。
现在你有一个 test
对象,它是一个 dynamic
- 你可以将它与 duck typing 一起使用(例如,这对速度有一些影响),但通常你可以无论您想用普通 IEnumerable<YourType>
.
做什么
如果要使用反射:
MethodInfo getAll= typeof(Repository).GetMethod("GetAll");
MethodInfo getAllGeneric= getAll.MakeGenericMethod(ParentTableClass);
object result = getAllGeneric.Invoke(this, null);
//or null, null is Repository is static
var finalObject = result as IEnumerable;
请注意,由于此 ParentTableClass
在编译期间是未知的,因此您将无法访问实际类型提供的任何内容 - 除非您使用 dynamic
方法。
我有一个带有此签名的方法
public IEnumerable<T> GetAll<T>() where T : new()
{
// Orm Lite Version
return Connection.LoadSelect<T>();
}
编译时我不知道类型 T。我只知道运行时的 class 名称是否可以使用类似这样的反射来调用此方法?
string TargetTBLName = ...;//TargetTBLName get's it's value at runtime
Type ParentTableClass = Type.GetType(TargetTBLName);
IEnumerable<Type.GetType(TargetTBLName)> test = Repository.GetAll<Type.GetType(TargetTBLName)>();
有什么想法吗?
我想试一试 Dynamitey 图书馆。您可以通过多种不同的方式做到这一点,但我更喜欢这种方式,因为它很简单。你可以找到它 here.
var name = InvokeMemberName.Create;
var test = Dynamic.InvokeMember(Repository, name("GetAll", new[]{ParentTableClass }));
foreach(var obj in test)
{
obj.SomeMethodFromMyType();
}
请记住,如果 Repository
是静态的,那么您必须稍微调整一下才能使用静态调用上下文(查找 link)。
现在你有一个 test
对象,它是一个 dynamic
- 你可以将它与 duck typing 一起使用(例如,这对速度有一些影响),但通常你可以无论您想用普通 IEnumerable<YourType>
.
如果要使用反射:
MethodInfo getAll= typeof(Repository).GetMethod("GetAll");
MethodInfo getAllGeneric= getAll.MakeGenericMethod(ParentTableClass);
object result = getAllGeneric.Invoke(this, null);
//or null, null is Repository is static
var finalObject = result as IEnumerable;
请注意,由于此 ParentTableClass
在编译期间是未知的,因此您将无法访问实际类型提供的任何内容 - 除非您使用 dynamic
方法。