我有一个带有此签名的方法
public IEnumerable<T> GetAll<T>() where T : new()
{
// Orm Lite Version
return Connection.LoadSelect<T>();
}
在编译时我不知道类型T.我只知道运行时的类名是否可以使用这样的反射调用此方法?
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)>();
任何想法?
答案 0 :(得分:2)
我会给一个Dynamitey图书馆。你可以通过许多不同的方式做到这一点,但我更喜欢这个,因为它简单。你可以找到它here。
var name = InvokeMemberName.Create;
var test = Dynamic.InvokeMember(Repository, name("GetAll", new[]{ParentTableClass }));
foreach(var obj in test)
{
obj.SomeMethodFromMyType();
}
请记住,如果Repository
是静态的,那么您必须稍微调整它以使用静态调用上下文(查找链接)。
现在你有一个test
对象,它是一个dynamic
- 你可以使用鸭子打字(例如,它对速度有一些影响),但一般来说你可以做任何你做的事情想要做一个正常的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
方法,否则您将无法访问实际类型提供的任何内容。