2013-07-09 35 views
1

我有一種方法,其中的對象的類型提前知道,並且該對象(及其類型)需要傳遞給方法,例如:調用T的方法,其中類型包含在一個字符串中

public void foo() 
{ 
    string type_of_object = "person"; 
    person p = new person(); 

    // insert code here 
} 

public T method<T>(object obj) 
{ 
    // some functions go here 
    return (T)... 
} 

鑑於可能有數百種類型,我不得不處理,我不想做每種類型的switch語句。我似乎無法弄清楚如何沿着這些路線做些什麼:

var foo = method<person.GetType()>(p); 

任何接受者?

+1

我知道有時事情可能是你無法控制的,但如何走到這一步是必須擺在首位? – Ocelot20

+0

通用參數必須是編譯時常量,無論是推斷的還是顯式的。您無法提供類型值,您實際上必須提供類型名稱。基本上,你不能做你在問什麼。 –

+0

這個特定應用程序的後半部分是通用的。我們正在嘗試增加通用代碼的數量。在每種情況下都有一個switch語句,每種類型都有相同的代碼塊(當然類型有變化),但問題是類型的數量將會變得非常非常大。乾杯 – joelc

回答

3

你可以使用反射。你的情況是這樣的:

MethodInfo method = this.GetType().GetMethod("method"); 
MethodInfo generic = method.MakeGenericMethod(p.GetType()); 
generic.Invoke(this, p); 

檢查這樣的響應:How do I use reflection to call a generic method?

+2

我認爲你的'人'應該是'p.GetType()'或'typeof(person)' - 嘗試使用問題中的名字。 –

+0

我認爲這有同樣的問題。 「person」組件存儲在一個字符串中。我相信我需要以某種方式將字符串作爲參數傳遞給解決方案中的第二行。 – joelc

+0

如果該人存儲在一個字符串中,您如何創建一個新的人物對象? – fcuesta

0

我認爲反射庫應該對此有所幫助。反射速度可能會很慢,但是如果在程序開始時,您可以製作字符串類型的字典,那麼速度可能會加快。

var dict = Assembly.GetExecutingAssembly().GetTypes().ToDictionary(t => t.Name, t => t); 

然後,在你自己的代碼:

Type targetType; 
if (!dict.TryGet(type_of_object, out targetType)) { 
    // log error with unknown type 
} 

我寫在答題框,而不是一個編輯器,所以道歉,如果我錯過了一些東西簡單。我也不完全確定我對你的「一些功能」會有什麼想法。 此外,我的代碼沒有考慮多個類型,在單獨的名稱空間中使用相同的名稱。你可能要考慮如果你做的比「String,Int32 ...」多

相關問題