只有T,T才能在运行时使用

时间:2015-02-10 14:10:16

标签: reflection ienumerable

我有一个带有此签名的方法

 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)>();

任何想法?

1 个答案:

答案 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方法,否则您将无法访问实际类型提供的任何内容。