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