我正在嘗試從web.config文件讀取有關對象的信息,並基於此創建對象。但是,我只希望能夠從擴展特定接口的類創建對象(IModule
)。該類型的對象是從類型屬性來在web.config:C#類型擴展接口
<module moduleAlias="Test" type="ASPNETMVCMODULES.TestModule" connectionStringName="ApplicationServices">
<properties>
<property name="prop1" value="abc" type="System.String"/>
<property name="prop2" value="123" type="System.Int32"/>
</properties>
</module>
在我的代碼,ASPNETMVCMODULES.TestModule
呢,其實,延長IModule
和它加載就好了用下面的代碼:
我遇到的問題是,因爲我將每個對象定義爲IModule
,所以我無法訪問我添加到擴展類中的任何其他方法或屬性。有什麼辦法讓我用自己的類型創建對象,同時確保它可以延伸IModule
?可能使用System.Convert
值得從IModule
轉換爲TestModule
(在這種情況下)?
理想情況下,我希望能夠使用modT
定義對象,該對象是直接來自web.config的對象的類型。
public void LoadModules()
{
ASPNETMVCMODULES.Configuration.ModulesSection allModules = (ASPNETMVCMODULES.Configuration.ModulesSection)System.Web.Configuration.WebConfigurationManager.GetSection("mvcmodules");
foreach (Configuration.Module mod in allModules.Modules)
{
Type modT = Type.GetType(mod.ModuleType);
IModule ob = (IModule)Activator.CreateInstance(modT);
foreach (ASPNETMVCMODULES.Configuration.ModuleProperty modP in mod.ModuleProperties)
{
object origVal = modP.Value;
object newVal = Convert.ChangeType(origVal, Type.GetType(modP.PropertyTypeString));
ob.Properties.Add(modP.Name, newVal);
}
//Have to add some properties manually
ob.Properties.Add("ConnectionString", (string)mod.ConnectionString);
//RegisterModule(string, IModule)
RegisterModule(mod.ModuleAlias, ob);
}
}
感謝
這確實有助於確保只有那些擴展接口的類被加載,謝謝。不過,我仍然在創建'modT'的實例時遇到了問題。如果我沒有將'Activator.CreateInstance(modT);'轉換爲'IModule',那麼我將無法在代碼中稍後訪問其方法和屬性。 – AndyBursh 2010-06-21 10:36:19
@AndyBrush - 我更新了答案。這是你的意思嗎?這是你已經完成的,它應該工作得很好。 – GenericTypeTea 2010-06-21 10:38:10
@GenericTypeTea謝謝。此代碼適用於從web.config加載所有模塊,但是當我需要訪問類型爲「modT」的任何其他方法或屬性時,它會開始變形。有沒有辦法顯式創建一個'modT'對象而不是'IModule'?也許類似於'IModule ob =(IModule)Activator.CreateInstance(modT);'? – AndyBursh 2010-06-21 10:44:37