В настоящее время я пытаюсь прочитать информацию об объекте из файла web.config, а также создать и объект на основе этого. Тем не менее, я только хочу иметь возможность создавать объекты из классов, которые расширяют определенный интерфейс (IModule
). Тип объекта исходит из атрибута типа в web.config:C# type extends interface
<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);' to 'IModule', то я не могу получить доступ к его методам и свойствам позже в коде. – AndyBursh
@ AndyBrush - я обновил ответ. Это ты имел в виду? Это то, что вы уже сделали, и оно должно работать нормально. – GenericTypeTea
@GenericTypeTea Спасибо. Этот код отлично подходит для загрузки всех модулей из web.config, однако он начинает расти, когда мне нужно получить доступ к любым дополнительным методам или свойствам типа 'modT'. Есть ли способ явно создать объект 'modT', а не' IModule'? Возможно, аналогично «IModule ob = (IModule) Activator.CreateInstance (modT);»? – AndyBursh