Тип C # расширяет интерфейс - PullRequest
1 голос
/ 21 июня 2010

В настоящее время я пытаюсь прочитать информацию об объекте из файла web.config и создать объект на основе этого.Однако я только хочу иметь возможность создавать объекты из классов, которые расширяют определенный интерфейс (IModule).Тип объекта исходит из атрибута типа в web.config:

  <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 ]

2 голосов
/ 21 июня 2010

Вы можете определить, есть ли у класса определенный интерфейс со следующим битом кода:

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 голосов
/ 21 июня 2010

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

  1. Использование XmlSerializer
  2. Создайте экземпляр с помощью <a href="http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx" rel="nofollow noreferrer">Activator.CreateInstance(T)</a>, затем установите свойства самостоятельно, используя Reflection, PropertyInfo[] props = typeof(T).GetProperties() и попытайтесь найти свойства в созданном вами экземпляре.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...