2017-01-30 5 views
-2

Мне нужно получить тип всех членов, присутствующих в классе.Получение типов всех членов класса

public class Order 
    { 
     public int OrderID { get; set; } 
     public int EmployeeID { get; set; } 
     public string CustomerID { get; set; } 
     public DateTime OrderDate { get; set; } 
     public bool Verified { get; set; } 

     public Order(int orderId, int empId, string custId, DateTime orderDate, bool verify) 
     { 
      this.OrderID = orderId; 
      this.EmployeeID = empId; 
      this.CustomerID = custId; 
      this.OrderDate = orderDate; 
      this.Verified = verify; 
     } 
    } 

и значение для класса я добавил через список

  List<dynamic> dy = new List<dynamic>(); 
      dy.Add(new { OrderID = 11, EmployeeID = 5, CustomerID = "ALFKI", OrderDate = new DateTime(2015,01, 10), Verified = true }); 
      dy.Add(new { OrderID = 12, EmployeeID = 4, CustomerID = "CDSAW", OrderDate = new DateTime(2015, 02, 12), Verified = true }); 
      dy.Add(new { OrderID = 13, EmployeeID = 6, CustomerID = "ASDFG", OrderDate = new DateTime(2015, 03, 13), Verified = true }); 
      dy.Add(new { OrderID = 14, EmployeeID = 3, CustomerID = "XSDAF", OrderDate = new DateTime(2015, 04, 14), Verified = false }); 
      dy.Add(new { OrderID = 15, EmployeeID = 2, CustomerID = "MNHSD", OrderDate = new DateTime(2015, 05, 15), Verified = true }); 
      dy.Add(new { OrderID = 16, EmployeeID = 1, CustomerID = "OKJHG", OrderDate = new DateTime(2015, 06, 16), Verified = false }); 
      return dy; 

Для получения типов полей, я попытался с помощью следующего кода.

Type type = dataSource.GetElementType(); 
Type t = typeof(object); 
t = type.GetProperty("OrderDate").PropertyType; 

Его выброс ошибки с нулевым выражением.

Здесь OrderDate - объект DateTime.

Type type = dataSource.GetType(); 

Эта строка возвращает System.object.

При попытке получить тип поля OrderDate.

type.GetProperty(filterString).PropertyType; 

возвращает Null, как исправить эту проблему.

Интернет: https://dotnetfiddle.net/zTYJGU

+0

Вы означает, как описано здесь? http://stackoverflow.com/questions/6536163/how-to-list-all-variables-of-class – Essigwurst

+8

Это похоже на неправильное использование 'dynamic' ... –

+0

вы можете определить, что такое' dataSource'? –

ответ

0

Прежде всего, если вы хотите, чтобы получить все типы полей и свойств в указанном типе вы должны знать некоторые вещи.

У каждого имущества есть собственное поле поддержки. Для автоматически генерируемого имущества public int MeProperty { get; set; } поле поддержки будет иметь имя <MeProperty>k__BackingField.

Зная это, вы должны рассмотреть вопрос об извлечении FieldInfo вместо PropertyInfo.

Другое дело, что вы предполагаете, что метод GetProperty будет извлекать даже скрытые (), и т. Д.) Членов, что совершенно неверно. Он ожидает, что вы укажете уровень доступности, используя перечисление BindingFlags.

После того, как все эти знания вы можете просто извлечь все поля вместо внесения свойств с помощью:

var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 

После этого вы можете перечислить и получить типы полей:

var fieldTypes = fields.Select(f => f.FieldType); 

Теперь вы fieldTypesIEnumerable<Type>, содержащий все поля, указанные в поле type.

Настоящая проблема заключается в том, что вы хотите реализовать auto-mapper, который создает определенный тип из динамического типа.Для этого я бы рекомендовал вам использовать решение от my answer on this question

EDIT:

Используя этот код:

class Program 
{ 
    static void Main() 
    { 
     foreach(var field in typeof(Order).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) 
     { 
      Console.WriteLine(field.Name); 
     } 
    } 

    public class Order 
    { 
     public int OrderID { get; set; } 
     public int EmployeeID { get; set; } 
     public string CustomerID { get; set; } 
     public DateTime OrderDate { get; set; } 
     public bool Verified { get; set; } 

     public Order(int orderId, int empId, string custId, DateTime orderDate, bool verify) 
     { 
      this.OrderID = orderId; 
      this.EmployeeID = empId; 
      this.CustomerID = custId; 
      this.OrderDate = orderDate; 
      this.Verified = verify; 
     } 
    } 
} 

Вы должны иметь тот же результат:

<OrderID>k__BackingField                                                        
<EmployeeID>k__BackingField                                                        
<CustomerID>k__BackingField                                                        
<OrderDate>k__BackingField                                                        
<Verified>k__BackingField 
+0

Hi Rogalsi, я попытался с вашим решением. Но я получаю только три поля, а не все поля – Kalai

Смежные вопросы