我有一個方法與下面簽名
public string Register<T>()
{
//code
}
可以調用這樣
var result = Register<Employee>()
;
我的要求是通過讀取從配置文件中的類型T要調用的方法,
即: 雖然調用,而不是硬編碼「僱員」,我應該能夠通過讀取動態它供給配置文件。
任何想法如何做到這一點?
我有一個方法與下面簽名
public string Register<T>()
{
//code
}
可以調用這樣
var result = Register<Employee>()
;
我的要求是通過讀取從配置文件中的類型T要調用的方法,
即: 雖然調用,而不是硬編碼「僱員」,我應該能夠通過讀取動態它供給配置文件。
任何想法如何做到這一點?
那麼你可以使用反射,特別是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
kramer:它的工作原理,感謝您的詳細分析,您節省了我的時間。 –
類型參數在編譯時需要,所以爲了做到這一點,你需要使用反射。
在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>();
}
獲取錯誤\t「無法找到類型或名稱空間名稱'obj'(您是否缺少using指令或程序集引用?)」, 但是我正在尋找這樣的解決方案.. –
@BrazilNut我編輯了我的答案。檢查web.config部分 – Nathan
這仍然不會編譯,因爲'obj'是'Type'的一個實例,而不是編譯時類型參數。檢查dwerner的答案是爲了你想要做的。 –
任何機會DI容器註冊是這樣嗎?大多數DI容器都有內置的配置文件功能。 –
@ default.kramer:是的,你有我,我使用simpleinjector沒有基於xml的配置 –