2014-11-06 37 views
2

我正在使用反射来调用泛型方法,此方法返回一个对象,我想要在之后调用方法。在运行时将对象投射到泛型

public static string GetTableName(this ObjectContext context, Type T) 
{ 
    var method = typeof(ObjectContext).GetMethod("CreateObjectSet", new Type[]{}); 
    var generic = method.MakeGenericMethod(T); 
    var objectSet = generic.Invoke(context, null); 

    var sqlString = objectSet.ToTraceString(); 
    // doesn't work because ToTraceString() isn't a method of object 
    // it's a method of ObjectSet<T> 
    ... 
} 

T直到运行时才知道。我如何投ObjectSet对象集<T>能够调用ToTraceString()?

+0

你必须使用更多的反射调用在'objectSet'什么。 – TyCobb 2014-11-06 00:31:13

+1

请记住,你可以用你永远不需要投射或反射的方式来构建你的程序。寻找函数式编程和F#。 – 2014-11-06 00:33:49

+0

你有没有考虑动态参考? – recursive 2014-11-06 00:49:09

回答

3

由于TyCobb表示,您已经使用了更多的反思。一直走,直到你到达某种类型的,你可以写为铸像string

public static string GetTableName(this ObjectContext context, Type T) 
{ 
    var method = typeof(ObjectContext).GetMethod("CreateObjectSet", new Type[] { }); 
    var generic = method.MakeGenericMethod(T); 
    var objectSet = generic.Invoke(context, null); 

    var toTrace = typeof(ObjectSet<>).MakeGenericType(T).GetMethod("ToTraceString"); 
    var sqlString = (string)toTrace.Invoke(objectSet, null); 

    //... 
}