2009-07-09 8 views
2

Ma classe C# MyClass (ci-dessous) a des membres a, b, c, d, e et f.Réflexion en C# - veut une liste des types de données des champs d'une classe

Je voudrais utiliser la réflexion pour obtenir une liste des types de données de ces membres; Par exemple (empruntant à la notation Python): [char [], ushort, char, octet, uint, ulong]

class MyClass 
{ 
    public char [ ] a ; 
    public ushort  b ; 
    public char  c ; 
    public byte  d ; 
    public uint  e ; 
    public ulong  f ; 
} 

class MainClass 
{ 
public static void Main (string [] args) 
    { 
     // get an array (or some kind of list) of MyClass' fields' data types ... 
     // for example: { char[], ushort, char, byte, uint, ulong } 

     // I've tried the following, but can't get a column of just the data types, alone ... 
     MemberInfo[] theMemberInfoArray = typeof(MyClass).GetMembers() ; 
     foreach (MemberInfo mi in theMemberInfoArray) 
      if (mi.MemberType == MemberTypes.Field) 
        Console.WriteLine ("<" + mi.MemberType + ">\t" 
        + "<" + mi.GetType() + ">\t" 
        + "<" + mi.Name + ">\t" + mi) ; 
    } 

}

sortie du programme apparaît comme ci-dessous:

<Field> <System.Reflection.RtFieldInfo> <a>  Char[] a 
<Field> <System.Reflection.RtFieldInfo> <b>  UInt16 b 
<Field> <System.Reflection.RtFieldInfo> <c>  Char c 
<Field> <System.Reflection.RtFieldInfo> <d>  Byte d 
<Field> <System.Reflection.RtFieldInfo> <e>  UInt32 e 
<Field> <System.Reflection.RtFieldInfo> <f>  UInt64 f 

Je voudrais sortie du programme apparaisse comme:

<Field> <System.Reflection.RtFieldInfo> <a>  <Char[]>  Char[] a 
<Field> <System.Reflection.RtFieldInfo> <b>  <UInt16>  UInt16 b 
<Field> <System.Reflection.RtFieldInfo> <c>  <Char>  Char c 
<Field> <System.Reflection.RtFieldInfo> <d>  <Byte>  Byte d 
<Field> <System.Reflection.RtFieldInfo> <e>  <UInt32>  UInt32 e 
<Field> <System.Reflection.RtFieldInfo> <f>  <UInt64>  UInt64 f 
+2

Dans votre message la sortie réelle et ce que vous dites que vous voulez que la sortie soit identiques. Je suppose que vous voulez quelque chose d'autre que ce que vous avez posté, alors s'il vous plaît modifier votre question pour clarifier ce que votre sortie souhaitée est réellement. –

+0

Vous devez mettre en retrait par quatre pour conserver le format. Je l'ai fait pour toi. BTW, ça s'appelle "Reflection", pas "introspection". –

+2

Je ne comprends pas la différence entre les deux sorties. La sortie désirée consiste simplement à répéter la colonne 4 sans les chevrons. –

Répondre

10

Voici comment je l'ai fait, vous voulez le FieldType qui retourne réellement une instance de type.

var members = typeof(TestMe).GetFields().Select(m => new 
             { 
              Name = m.Name, 
              MemType = m.MemberType, 
              RtField = m.GetType(), 
              Type = m.FieldType 
             }); 

foreach (var item in members) 
    Console.WriteLine("<{0}> <{1}> <{2}> <{3}> {3} {2}", item.MemType, item.RtField, item.Name, item.Type, item.Type, item.Name); 

public class TestMe 
{ 
    public string A; 
    public int B; 
    public byte C; 
    public decimal D; 
} 

C'est la sortie:

<Field> <System.Reflection.RtFieldInfo> <A> <System.String> System.String A 
<Field> <System.Reflection.RtFieldInfo> <B> <System.Int32> System.Int32 B 
<Field> <System.Reflection.RtFieldInfo> <C> <System.Byte> System.Byte C 
<Field> <System.Reflection.RtFieldInfo> <D> <System.Decimal> System.Decimal D 
+0

Merci pour cette idée. J'ai dû le modifier un peu pour que ça marche pour moi, mais l'idée m'est venue - merci encore. FieldInfo [] fieldInfoArray = typeof (MyClass) \t \tGetFields(); \t \t \t \t Liste fieldTypeList = nouvelle liste (); \t \t foreach (FieldInfo fieldInfo dans fieldInfoArray) \t \t \t fieldTypeList.Add (fieldInfo.FieldType); \t \t \t \t \t foreach (type System.Type dans fieldTypeList) \t \t \t Console.WriteLine (type); – JaysonFix

+1

pas de problème. BTW si vous voulez juste une liste. vous pouvez utiliser la méthode .ToList() dans Linq comme suit: Liste list = typeof (TestMe) .GetFields(). Sélectionnez (m => m.FieldType) .ToList(); –

0

mi.Name apporte voulez revenir vous voulez , vous devez changer votre COnsole.WriteLine pour l'imprimer à nouveau

+0

Je suppose que vous pourriez m'avoir mal compris. Je veux une liste des * types de données *, pas les noms de champs. Par exemple, je veux une liste [char [], ushort, char, octet, uint, ulong], une liste que je peux utiliser par programmation, et pas simplement afficher sur le screeen. – JaysonFix

+0

Donc, dans votre boucle où vous les écrivez à la console, ajoutez les types à une liste en utilisant Type.GetType (mi.Name) – cjk

+0

Désolé, au lieu de mi.Name vous voulez mi.GetType() – cjk

1

Je ne suis pas sûr que MemberInfo a les informations que vous souhaitez. Vous voudrez peut-être regarder GetFields() et la classe FieldInfo, ou GetProperties() et la classe PropertyInfo.

GetMembers()GetMembers() Renvoie tous les champs, propriétés et méthodes, donc si votre classe les contenait, ils seraient également énumérés.

+0

C'est aussi une bonne idée ... merci. – JaysonFix

1

Vous recherchez la propriété Name en dehors de FieldType, disponible via FieldInfo. Vous aurez besoin de jeter MemberInfo à un FieldInfo premier:

foreach (MemberInfo mi in theMemberInfoArray) 
{ 
    if (mi.MemberType == MemberTypes.Field) 
    { 
     FieldInfo fi = mi as FieldInfo; 
     Console.WriteLine(fi.FieldType.Name); 
    } 
}   

Sortie:

Char[] 
UInt16 
Char 
Byte 
UInt32 
UInt64 
+0

Merci! J'aimerais pouvoir accepter plusieurs réponses, puisque votre idée est également bonne. – JaysonFix

Questions connexes