2016-09-10 2 views
1

Мне нужно рекурсивно получить все свойства объекта DateTime.Как рекурсивно получить свойства типа с использованием отражения?

В настоящее время я делаю:

public static void GetDates(this object value) 
{ 
    var properties = value.GetType().GetProperties(); 

    foreach (var property in properties) 
    { 
     if (property.GetType().IsClass) 
     { 
      property.SetDatesToUtc(); 
     } 
     else 
     { 
      if (property.GetType() == typeof(DateTime)) 
      { 
       //Do something... 
      } 
     } 
    } 
} 

Однако использование property.GetType().IsClass не достаточно, так как даже строки или даты свойства классов.

Есть ли способ получить свойства, являющиеся фактическими классами?

Было бы лучше, если бы я добавил интерфейс к классам, у которых есть свойства DateTime, а затем проверить, реализует ли это свойство этот интерфейс?

+0

Какова цель первого оператора if? –

+0

@ MathiasR.Jessen Первый оператор 'if' проверяет, является ли свойство ссылочным типом. –

ответ

0

Я добавил интерфейс к классам, у которых есть свойство DateTime. Поэтому метод изменяется на:

public static void GetDates(this object value) 
{ 
    var properties = value.GetType().GetProperties(); 
    foreach (var property in properties) 
    { 
     if (typeof(IHasDateProperty).IsAssignableFrom(property.PropertyType)) 
     { 
      property.SetDatesToUtc(); 
     } 
     else 
     { 
      if (property.GetType() == typeof(DateTime)) 
      { 
       //Do something... 
      } 
     } 
    } 
} 
+0

Хотя это будет работать, если вы решите пойти по этому пути, а не по тому, что у меня есть в своем ответе, я бы предложил использовать атрибут класса, а не добавлять интерфейс, который на самом деле не раскрывает какие-либо методы или свойства. – pquest

1

Вы на правильном пути, но я думаю, что ваша логика немного изменилась. Вы должны менять дату и время на одном и том же методе:

public static void GetDates(this object value) 
{ 
    if(value == null) //if this object is null, you need to stop 
    { 
     return; 
    } 
    var properties = value.GetType().GetProperties(); 
    foreach(PropertyInfo property in properties) 
    { 
     //if the property is a datetime, do your conversion 
     if(property.GetType() == typeof(DateTime)) 
     { 
      //do your conversion here 
     } 
     //otherwise get the value of the property and run the same logic on it 
     else 
     { 
      property.GetValue(value).GetDates(); // here is your recursion 
     } 
    } 
}