2010-01-08 5 views
4

J'ai vu beaucoup de questions posées sur l'instanciation de classes à partir d'une chaîne, mais je n'ai trouvé aucune information sur la création d'une structure de la même manière.Création d'une structure à partir d'une chaîne en C#

J'ai une classe qui contient une structure comme ceci:

Public Structure callDetails 
    Public GUID As Guid 
    Public ringTime as Date 
    Public CBN As String 

etc.

Tout ce que je veux vraiment faire est d'obtenir les noms des champs de la structure. Je ne me soucie pas de manipuler les données dans les champs.

Jusqu'à présent, je peux me rapprocher de cela.

 callDetails callTableDef= new callDetails(); 

     Type tableType = callTableDef.GetType(); 

     object tableStruct = (object)Activator.CreateInstance(tableType); 
     System.Reflection.FieldInfo[] fields = tableType.GetFields(); 
     foreach (System.Reflection.FieldInfo field in fields) 
     Debug.WriteLine(field.Name + " = " + field.GetValue(tableStruct)); 

Cependant, j'ai encore besoin de créer une instance de la structure avec le nom réel. Je veux être en mesure de passer dans une chaîne comme ceci:

Type tableType = System.Type.GetType("callDetails"); 

Quand je fais ce que je reçois un ArgumentNullException de Activator.CreateInstance()

est-ce pas getType censé rechercher la valeur passée à comme une chaîne et le retour du type?

Je suis nouveau en C# ayant programmé principalement en Java jusqu'à ce projet.

+1

PascalCase !!!!!! – Will

Répondre

5

Vous devez qualifier le nom du type avec son espace de nommage:

Type tableType = System.Type.GetType("mynamespace.callDetails"); 

Si elle est dans un assemblage différent, vous avez besoin de l'ensemble nom qualifié. Détails peuvent par trouvé on MSDN. Avec juste le nom de type que vous avez, il ne sera pas en mesure de résoudre et retournera null, d'où votre exception null d'argument.

1

Si la structure ou la classe est accessible, c'est-à-dire que vous avez une référence, il est préférable d'utiliser GetType, car cela prend la structure/classe au lieu d'une chaîne. Cela signifie qu'il échouera au moment de la compilation quand il y a une erreur, et vous donne également de meilleures possibilités de réusiner

Type tableType = GetType(callDetails) 

en C#:

Type tableType = typeof(callDetails); 
0

Merci David,

Cette référence MSDN était exactement ce dont j'avais besoin. J'ai essayé de le qualifier autant de façons que je le savais. La classe était dans une assemblée différente. J'ai essayé

Type tableType = System.Type.GetType("CommonTables.callDetails"); 

sans aucun effet.

Pour d'autres qui cherchent cette question est ici ce que je devais faire:

Après avoir écrit ce qui suit pour debug:

Debug.WriteLine("DEBUG ASSEMBLY QUALIFIED NAME= " + callTableDef.GetType().AssemblyQualifiedName.ToString()); 

il m'a donné ce comme l'assemblée nom qualifié.

CommonTables.callDetails, callDetails, Version=3.0.4.0, Culture=neutral, PublicKeyToken=null 

Et c'est la chaîne que j'ai dû utiliser dans la méthode getType(). juste le assembly.classname n'a pas fonctionné.

Questions connexes