Reflection in C # - хотите получить список типов данных полей класса - PullRequest
2 голосов
/ 09 июля 2009

Мой класс C # MyClass (ниже) имеет члены a, b, c, d, e и f.

Я хотел бы использовать отражение, чтобы получить список типов данных этих членов; например (заимствование из нотации Python): [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 ) ;
    }

}

Вывод программы выглядит следующим образом:

<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

Я бы хотел, чтобы вывод программы отображался как:

<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

Ответы [ 4 ]

10 голосов
/ 09 июля 2009

вот как я это сделал, вам нужен FieldType, который на самом деле возвращает экземпляр типа.

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

Это вывод:

<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
1 голос
/ 09 июля 2009

Вы ищете свойство Name вне FieldType, которое доступно через FieldInfo. Сначала вам нужно будет преобразовать MemberInfo в FieldInfo:

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

Выход:

Char[]
UInt16
Char
Byte
UInt32
UInt64
1 голос
/ 09 июля 2009

Я не уверен, что MemberInfo имеет информацию, которую вы хотите. Возможно, вы захотите взглянуть на GetFields() и класс FieldInfo, или GetProperties() и класс PropertyInfo.

GetMembers() возвращает все поля, свойства и методы, поэтому, если бы ваш класс содержал их, они также были бы перечислены.

0 голосов
/ 09 июля 2009

mi.Name возвращает желаемое, вам просто нужно изменить COnsole.WriteLine, чтобы напечатать его снова

...