2014-11-06 51 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); 

    //... 
}