我目前正在尝试从web.config文件中读取有关对象的信息,并基于此创建和对象。但是,我只希望能够从扩展特定接口(IModule
)的类创建对象。对象的类型来自web.config中的type属性:
<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
来定义对象, 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);
}
}
是直接来自web.config的对象类型。
{{1}}
由于
答案 0 :(得分:2)
您可以使用以下代码来确定某个类是否具有特定接口:
public void LoadModules()
{
// ...
Type modT = Type.GetType(mod.ModuleType);
if (InheritsFromInterface(modT, typeof(IModule))
{
IModule ob = (IModule)Activator.CreateInstance(modT);
// ...
}
}
public bool InheritsFromInterface(Type inheritor, Type interface)
{
Type result = inheritor.GetInterface(interface.FullName);
return result != null;
}
希望这就是你所追求的目标。
答案 1 :(得分:0)
你有几个不同的选择,我自己也用过这两个。
Activator.CreateInstance(T)
创建实例,然后使用Reflection PropertyInfo[] props = typeof(T).GetProperties()
自行设置属性,并尝试在创建的实例中查找属性。