Получение коллекции всех членов класса - PullRequest
9 голосов
/ 21 июля 2011

Я хочу получить коллекцию всех членов, присутствующих в классе.Как я могу это сделать?Я использую следующее, но оно дает мне много дополнительных имен вместе с участниками.

Type obj  =  objContactField.GetType();
MemberInfo[] objMember = obj.GetMembers();
String name = objMember[5].Name.ToString();

Ответы [ 5 ]

9 голосов
/ 21 июля 2011

Если вы хотите получить коллекцию всех свойств и их значений, сделайте следующее:

class Test
{
    public string Name { get; set; }
}

Test instance = new Test();
Type type = typeof(Test);

Dictionary<string, object> properties = new Dictionary<string, object>();
foreach (PropertyInfo prop in type.GetProperties())
    properties.Add(prop.Name, prop.GetValue(instance));

Обратите внимание, что вам нужно будет добавить using System.Collections.Generic; и using System.Reflection;, чтобы пример работал.

5 голосов
/ 27 апреля 2013

С MSDN , членами класса являются:

Поля

Константы (входит в поля)

Свойства

Методы

События

Операторы

Индексаторы (входит в Свойства)

Конструкторы

деструкторы

Вложенные типы

Когда вы делаете GetMembers в классе, вы получаете все это (включая статические, определенные для класса, такие как static / const / operator, не говоря уже о экземплярах) этого класса и членов экземпляров классов, которые он наследуется (без статических / константных / операторов базовых классов), но не дублирует переопределенные методы / свойства.

Для фильтрации у вас есть GetFields, GetProperties, GetMethods, а для большей гибкости, есть FindMembers

3 голосов
/ 21 июля 2011

Ну, это немного зависит от того, что вы получаете. Например:

   static void Main(string[] args)
    {
        Testme t = new Testme();
        Type obj = t.GetType();

        MemberInfo[] objMember = obj.GetMembers();

       foreach (MemberInfo m in objMember)
       {
           Console.WriteLine(m);
       } 
    }


    class Testme
    {
        public String name;
        public String phone;
    }

Возвращает

System.String ToString()
Boolean Equals(System.Object)
Int32 GetHashCode()
System.Type GetType()
Void .ctor()
System.String name
System.String phone

Это то, что я ожидал, помните, только потому, что ваш класс откуда-то наследуется, по умолчанию есть и другие вещи.

2 голосов
/ 21 июля 2011

Код выглядит правильно.Являются ли дополнительные имена, которые вы получаете членами, унаследованными от базового класса?

0 голосов
/ 23 февраля 2013

Linqpad Демонстрационная программа

Чтобы было проще понять, что делает код из dknaack, я создал демонстрационную программу linqpad

void Main()
{
   User instance = new User();
   Type type = typeof(User);

   Dictionary<string, object> properties = new Dictionary<string, object>();
   foreach (PropertyInfo prop in type.GetProperties())
         properties.Add(prop.Name, prop.GetValue(instance));
   properties.Dump();    
}

// Define other methods and classes here        
class User
{
    private string foo;
    private string bar { get; set;}
    public int id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public System.DateTime Dob { get; private set; }
    public static int AddUser(User user)
    {    
        // add the user code
        return 1;
    }
}
...