2011-09-02 154 views
0

我在我的ASP.NET應用程序中具有以下代碼,我想將converterName變量轉換爲 類並將其傳遞給FillRequest<T>方法。 這可能嗎?將類字符串轉換爲類

var converterName = HttpContext.Current.Items["ConverterName"] as string; 
FillRequest<Web2ImageEntity>(Request.Params); 

我也可以做

var converterName = HttpContext.Current.Items["ConverterName"] as string; 

if (converterName == "Web2ImageEntity") 
    FillRequest<Web2ImageEntity>(Request.Params); 

,但我有大約20實體類和我想找到一種方法來編寫代碼儘可能短。

+1

可能的重複http://stackoverflow.com/questions/1252371/initialize-a-class-by-string-variable-in-c – Reniuz

+0

不,你的貼子不回答我的問題。 – Tomas

回答

1

是的,看看Activator.CreateInstance():

 var converterName = HttpContext.Current.Items["ConverterName"] as string; 

     var type = Type.GetType(converterName); 
     var yourObject = Activator.CreateInstance(type); 

注意,類型必須有一個公共的無參數構造函數。這裏是MSDN文檔的鏈接;有重載的一羣,這可能是對你有用:

http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

UPDATE:如果你必須將對象傳遞給方法與泛型類型,那麼你會遇到問題,因爲該類型是未知在編譯時。在這種情況下,我會考慮讓所有的轉換器,實現一個共同的接口,這樣的事情:

var converterName = HttpContext.Current.Items["ConverterName"] as string; 

var type = Type.GetType(converterName); 
var yourObject = Activator.CreateInstance(type) as IMyConverter; 
if (yourObject != null) 
    FillRequest<IMyConverter>(yourObject); 
+0

是的,我已經嘗試使用您的建議代碼,但我沒有找到如何將T類傳遞給FillRequest 。你能告訴我該怎麼做嗎? – Tomas

+0

如果你的FillRequest方法有一個泛型類型參數,那麼這是不可能的。在這種情況下,我會考慮讓所有轉換器實現一個通用接口並調用FillRequest (...)? – JohnD

+0

@takrl謝謝,修正 – JohnD

4

爲泛型類型需要在編譯時指定這將是不可能的。 你可以做的是改變FillRequest方法是這樣的下面,然後使用反射來執行所需的任務

FillRequest(string[] params,Type converter) 
{ 
    //Create object from converter type and call the req method 
} 

,或使FillRequest採取界面

FillRequest(string[] params, IConverter c) 
{ 
//call c methods to convert 
} 

調用此會是這樣如:

var type = Type.GetType(converterName); 
    FillRequest(Request.Params,(IConverter)Activator.CreateInstance(type)); 
+0

每個* Entity類都有自己的屬性集合。我不明白在這種情況下如何使用Interface可以提供幫助。 – Tomas

+0

你的代碼看起來像你正在傳遞一些轉換器類型的名稱。如果它是一個實體對象,那麼在FillRequest中使用反射的第一個選項將完成這項工作 – Ankur

1

我發現代碼想法here。彼得·莫里斯指出,他把代碼喬恩長柄水杓書,所以如果它是有用的 - 高五到喬恩:)

創建方法:

public void DoFillRequest(Type type, string[] params) 
{ 
    MethodInfo methodInfo = this.GetType().GetMethod("FillRequest"); 
    MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(new Type[]{ type }); 
    genericMethodInfo.Invoke(this, new object[]{ params }); 
} 

,現在稱之爲:

var type = Type.GetType(converterName); 
DoFillRequest(type, Request.Params);