C#类型扩展接口

时间:2010-06-21 10:20:07

标签: c# interface types

我目前正在尝试从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}}

由于

2 个答案:

答案 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)

你有几个不同的选择,我自己也用过这两个。

  1. 使用XmlSerializer
  2. 使用Activator.CreateInstance(T)创建实例,然后使用Reflection PropertyInfo[] props = typeof(T).GetProperties()自行设置属性,并尝试在创建的实例中查找属性。