2008-10-28 6 views
4

J'ai lu certaines propriétés d'un fichier XML, parmi lesquelles une chaîne qui fait référence à un objet llblgen par exemple 'article'. Pour l'instant je l'ai mis en place une assez longue.NET: De la chaîne à l'objet

Select Case myString 
    Case "article" 
    return New ArticleEntity() 

Etc. qui devient assez laid qu'il obtient plus et plus;). Y a-t-il une meilleure manière de faire cela ?

(ci-dessus est vb.net, mais des exemples C# sont bien aussi)

+0

s'il vous plaît préciser quelle relation existe entre les chaînes et les noms de classe – devio

Répondre

3

vous pouvez créer une chaînes de mappage dictionnaire méthodes d'usine, par exemple

Dictionary<string, Func<Animal>> _map = new Dictionary 
{ 
    ("cat",() => new Cat()), 
    ("dog",() => new Dog()) 
    ... 
} 

Ensuite, votre déclaration de cas devient

return _map[myString](); 
2

Vous pouvez stocker les noms de type dans le fichier et l'utilisation:

return Activator.CreateInstance(Type.GetType("Some.Type.String")); 

(qui fonctionnerait aussi longtemps que Some.Type.String a un constructeur par défaut sans paramètre.)

1

Les chaînes représentent-elles exactement le nom du type d'objet. Si oui, vous pourriez probablement faire.

 Object obj = Activator.CreateInstance("AssemblyName", "TypeName"); 

donc si vous aviez les types qui reviennent d'une liste que vous pouvez faire ...

List<object> list = new List<object>(); 


foreach(string typename in GetFromXMLFile()) 
{ 
    list.Add(Activator.CreateInstance("AssemblyName", typename); 
} 
0

Notez que Activator.CreateInstance a obtenu une version générique qui fait un casting à une classe de base nécessaire (si une telle classe de base ou interface est disponible):

public static IMyTrait MakeMyTrait(Type t) { 
    return Activator.CreateInstance<IMyTrait>(t); 
} 
0

Ah très agréable. Je ne sais pas si les objets sont exactement comme dans le fichier, mais je préfère éditer ce fichier plutôt que de continuer à utiliser ce truc de cas laid laid :).

Merci pour les suggestions!

Questions connexes