2009-09-21 94 views
8

我有一個問題,涉及使用在運行時已知的類型參數調用類的泛型方法。使用在運行時確定的類型參數調用泛型函數

在具體的代碼看起來像這樣:


FieldInfo[] dataFields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance); 

// data is just a byte array used internally in DataStream 
DataStream ds = new DataStream(data); 

foreach (FieldInfo field in dataFields) 
{ 
    Type fieldType = field.FieldType; 

    // I want to call this method and pass in the type parameter specified by the field's type 
    object objData = (object) ds.Read<fieldType>(); 
} 

的read()函數看起來像這樣:


public T Read() where T : struct 

該功能的目的是返回從字節數組中讀取數據。

有沒有什麼辦法像這樣在運行時調用泛型方法?

回答

12

來處理這將是使讀取功能的非泛型重載使用單一類型的參數,最簡單的方法:

public object Read(Type t) 

,然後讓通用版本調用非泛型版本:

public T Read<T>() where T : struct 
{ 
    return (T)Read(typeof(T)) 
} 
+0

感謝您的回覆,我從來沒有考慮過這麼簡單的設計變更。 – 2009-09-21 18:26:33

+0

我的問題並沒有像OP問題那樣看起來像,但是你完全證明了我需要知道的東西。謝謝! – KennyZ 2012-05-20 13:39:59

7

你需要建立一個MethodInfo,並調用Read方法:

MethodInfo method = typeof(DataStream).GetMethod("Read"); 
MethodInfo generic = method.MakeGenericMethod(fieldType); 
object objData = generic.Invoke(ds, null); 
+0

再次感謝里德,您的幫助非常感謝。 – 2009-09-21 18:25:55

1

李的路線可能會更好。 Generic在設計時是速記,可以避免爲許多不同類型的類編寫通用代碼。在編譯時,每個對泛型方法或類的調用都基本上是作爲一個完全獨立的類生成的。

更簡單的就是低音的類型和使用反射,這是你將不得不做的反正。

+0

誠然,Lee的方法在性能方面也會更好,因爲檢索MethodInfo的附加反射是額外的計算,可以用他的方法避免。 – 2009-09-21 18:27:39

相關問題