2009-07-09 2 views
2

Meine C# -Klasse MyClass (unten) hat Mitglieder a, b, c, d, e und f.Reflektion in C# - will eine Liste der Datentypen einer Klasse 'Felder

Ich möchte Reflection verwenden, um eine Liste der Datentypen dieser Mitglieder zu erhalten; zum Beispiel (Ausleihe aus Python-Notation): [char [], ushort, char, byte, 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) ; 
    } 

}

Programmausgabe erscheint wie folgt:

<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 

Ich würde Programm Ausgabe gerne wie folgt aussehen:

<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

In Ihrem Beitrag die aktuelle Ausgabe und was Sie sagen, Sie die Ausgabe identisch sein sollen, werden sollen. Ich nehme an, Sie möchten etwas anderes als das, was Sie gepostet haben, also bearbeiten Sie bitte Ihre Frage, um zu klären, was Ihre gewünschte Ausgabe tatsächlich ist. –

+0

Um das Format beizubehalten, müssen Sie um vier einrücken. Ich habe es für dich getan. Übrigens, es heißt "Reflection", nicht "Introspektion". –

+2

Ich verstehe den Unterschied zwischen den beiden Ausgaben nicht. Die gewünschte Ausgabe wiederholt nur Spalte 4 ohne die spitzen Klammern. –

Antwort

10

So habe ich es gemacht, Sie möchten den FieldType, der tatsächlich eine Type-Instanz zurückgibt.

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

Dies ist die Ausgabe:

<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

Vielen Dank für diese Idee. Ich musste es ein wenig ändern, um es für mich arbeiten zu lassen, aber die Idee kam von dir - danke nochmal. \t \t Feldinfo [] fieldInfoArray = typeof (MyClass).GetFields(); \t \t \t \t Liste fieldTypeList = new List (); \t \t foreach (Fieldinfo fieldinfo in fieldInfoArray) \t \t \t fieldTypeList.Add (fieldInfo.FieldType); \t \t \t \t \t foreach (System.Type Typ in fieldTypeList) \t \t \t Console.WriteLine (type); – JaysonFix

+1

kein Problem. BTW wenn Sie nur eine Liste wollen. Sie könnten die .ToList() - Methode in Linq so verwenden: Liste list = typeof (TestMe) .GetFields(). Wählen Sie (m => m.FieldType) .ToList(); –

0

mi.Name bringt Sie zurück wollen wollen Sie müssen nur Ihre COnsole.WriteLine ändern, um es erneut zu drucken

+0

Ich vermute, Sie könnten mich missverstanden haben. Ich möchte eine Liste der * Datentypen *, nicht die Feldnamen. Zum Beispiel möchte ich eine Liste [char [], ushort, char, byte, uint, ulong], eine Liste, die ich programmatisch verwenden kann, und nicht nur auf dem Screenen anzeigen. – JaysonFix

+0

Fügen Sie in Ihrer Schleife, in der Sie sie in die Konsole schreiben, die Typen zu einer Liste hinzu mit Type.GetType (mi.Name) – cjk

+0

Sorry, anstelle von mi.Name möchten Sie mi.GetType() – cjk

1

Ich bin nicht sicher, dass Member die gewünschten Informationen hat. Vielleicht möchten Sie sich die Klassen GetFields() und FieldInfo oder GetProperties() und PropertyInfo ansehen.

GetMembers() gibt alle Felder, Eigenschaften und Methoden zurück. Wenn Ihre Klasse diese enthält, werden sie ebenfalls aufgelistet.

+0

Das ist auch eine gute Idee ... danke. – JaysonFix

1

Sie suchen nach der Eigenschaft Name von FieldType, die über FieldInfo verfügbar ist. Sie müssen Member an eine Fieldinfo ersten würfe

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

Ausgang:

Char[] 
UInt16 
Char 
Byte 
UInt32 
UInt64 
+0

Danke! Ich wünschte, ich könnte mehrere Antworten akzeptieren, da Ihre Idee auch eine gute ist. – JaysonFix

Verwandte Themen