2010-06-21 3 views
1

J'essaie actuellement de lire des informations sur un objet du fichier web.config et de créer et de créer un objet sur cette base. Cependant, je souhaite seulement pouvoir créer des objets à partir de classes qui étendent une interface particulière (IModule). Le type de l'objet provient d'un attribut de type dans le web.config:Le type C# étend l'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> 

Dans mon code, ASPNETMVCMODULES.TestModule ne, en fait, étendre IModule et il charge en très bien avec le code ci-dessous:

Le problème que j'ai est que, parce que je définis chaque objet comme un IModule, je ne peux pas accéder à d'autres méthodes ou propriétés que j'ajoute à la classe d'extension. Y at-il un moyen pour moi de créer l'objet avec son propre type, tout en assurant qu'il s'étend IModule? Pourrait utiliser System.Convert être utile de convertir de IModule à TestModule (dans ce cas)?

Idéalement, j'aimerais pouvoir définir l'objet en utilisant modT qui est le type de l'objet directement à partir du 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); 
     } 
    } 

Merci

Répondre

2

Vous pouvez déterminer si une classe a une interface particulière avec le bit de code suivant:

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

Espérons que c'est ce que vous êtes après.

+0

Cela aide certainement à assurer que seules les classes qui étendent l'interface sont chargées, merci. Cependant, j'ai toujours des problèmes avec la création d'une instance de 'modT'. Si je ne lance pas 'Activator.CreateInstance (modT);' en 'IModule', je ne peux pas accéder à ses méthodes et propriétés plus tard dans le code. – AndyBursh

+0

@AndyBrush - J'ai mis à jour la réponse. C'est ce que vous vouliez dire? C'est ce que vous avez déjà fait et cela devrait fonctionner correctement. – GenericTypeTea

+0

@GenericTypeTea Merci. Ce code fonctionne bien pour charger tous les modules de web.config, cependant il commence à patauger quand j'ai besoin d'accéder à des méthodes ou propriétés supplémentaires du type 'modT'. Est-il possible de créer explicitement un objet de 'modT' et non de' IModule'? Peut-être d'une manière similaire à 'IModule ob = (IModule) Activator.CreateInstance (modT);'? – AndyBursh

0

Vous avez quelques options différentes, j'ai utilisé ces deux moi-même.

  1. Utilisez
  2. Créer une instance avec Activator.CreateInstance(T) puis définissez les propriétés vous en utilisant la réflexion, PropertyInfo[] props = typeof(T).GetProperties() et essayer de trouver les propriétés dans votre instance créée.
+0

Merci pour l'entrée, mais je l'ai créé tous les objets et les propriétés de paramètres correctement maintenant. Mon problème est de taper ces objets; J'ai besoin qu'ils soient identiques au type dans 'modT' au lieu de' IModule', qui est l'interface qu'ils étendent, afin d'accéder à leurs propriétés et méthodes dans le code suivant. – AndyBursh