2010-06-21 4 views
1

В настоящее время я пытаюсь прочитать информацию об объекте из файла 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); 
     } 
    } 

Благодаря

ответ

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; 
} 

Надеюсь, это то, что вы после этого.

+0

Это, безусловно, помогает в обеспечении загрузки только тех классов, которые расширяют интерфейс, спасибо. Однако у меня все еще возникают проблемы с созданием экземпляра 'modT'. Если я не использую 'Activator.CreateInstance (modT);' to 'IModule', то я не могу получить доступ к его методам и свойствам позже в коде. – AndyBursh

+0

@ AndyBrush - я обновил ответ. Это ты имел в виду? Это то, что вы уже сделали, и оно должно работать нормально. – GenericTypeTea

+0

@GenericTypeTea Спасибо. Этот код отлично подходит для загрузки всех модулей из web.config, однако он начинает расти, когда мне нужно получить доступ к любым дополнительным методам или свойствам типа 'modT'. Есть ли способ явно создать объект 'modT', а не' IModule'? Возможно, аналогично «IModule ob = (IModule) Activator.CreateInstance (modT);»? – AndyBursh

0

У вас есть несколько разных вариантов, я сам использовал эти два.

  1. Использование
  2. Создать экземпляр с Activator.CreateInstance(T) затем установить свойства самостоятельно, используя Reflection, PropertyInfo[] props = typeof(T).GetProperties() и попытаться найти свойства в вашем созданном экземпляре.
+0

Спасибо за ввод, но у меня есть он, создавая все свойства объектов и настроек правильно прямо сейчас. Моя проблема заключается в наборе этих объектов; Мне нужно, чтобы они были такими же, как тип 'modT', а не' IModule', который является интерфейсом, который они расширяют, чтобы получить доступ к их свойствам и методам в следующем коде. – AndyBursh

Смежные вопросы