2012-09-18 30 views
0

可能重複:
How to use reflection to call generic Method?讀類型<T>

我有一個方法與下面簽名

public string Register<T>() 
{ 
    //code 
} 

可以調用這樣

var result = Register<Employee>();

我的要求是通過讀取從配置文件中的類型T要調用的方法,

即: 雖然調用,而不是硬編碼「僱員」,我應該能夠通過讀取動態它供給配置文件。

任何想法如何做到這一點?

+0

任何機會DI容器註冊是這樣嗎?大多數DI容器都有內置的配置文件功能。 –

+0

@ default.kramer:是的,你有我,我使用simpleinjector沒有基於xml的配置 –

回答

2

那麼你可以使用反射,特別是MakeGenericMethod,但如果你沒有在編譯時的類型似乎更好方法簽名更改爲Register(Type type)。然後你可以從配置文件中讀取類型並直接傳入。

編輯

如果添加到SimpleInjector.Extensions一個參考,你將能夠訪問非通用註冊方法。請參閱源文件中的NonGenericRegistrationsExtensions.cs。這將允許你做這樣的事情:

string typeName = GetTypeNameFromConfigFile(); 
Type type = Type.GetType(typeName); 
container.RegisterSingle(type, type); // register as self 

然後,你根本不需要泛型。

您可能還需要讀一遍Advanced Scenarios

+0

kramer:它的工作原理,感謝您的詳細分析,您節省了我的時間。 –

0

在web.config中

<appSettings> 
<!-- The assembly name of the default type. Use the format Fully.Qualified.Class.Name, Assembly.FileName --> 
<add key="DefaultType" value="MyTestApp.BusinessEntitites.Employee, MyTestApp.BusinessEntitites " /> 
</appSettings> 

在C#:

static void Main(string[] args) 
{ 
    Type obj = Type.GetType(ConfigurationManager.AppSettings["DefaultType"]); 
    ConstructorInfo constructor = obj.GetConstructor(new Type[] { }); 
    var myinstance = constructor.Invoke(null); 
    var result = Register<myinstance>(); 
} 
+0

獲取錯誤\t「無法找到類型或名稱空間名稱'obj'(您是否缺少using指令或程序集引用?)」, 但是我正在尋找這樣的解決方案.. –

+0

@BrazilNut我編輯了我的答案。檢查web.config部分 – Nathan

+0

這仍然不會編譯,因爲'obj'是'Type'的一個實例,而不是編譯時類型參數。檢查dwerner的答案是爲了你想要做的。 –