Как найти все свойства типа DateTime в классе? - PullRequest
20 голосов
/ 22 марта 2010

Мне нужно настроить дату и время для группы объектов.

Я бы хотел просмотреть свойства класса и, если тип dateTime, скорректировать соответствующим образом.

Есть ли какой-нибудь «тип описания», встроенный в совершенство, который я могу использовать?

Ответы [ 7 ]

24 голосов
/ 22 марта 2010

Для этого вы можете использовать отражение .

Ваш сценарий может выглядеть примерно так:

    static void Main(string[] args)
    {
        var list = new List<Mammal>();

        list.Add(new Person { Name = "Filip", DOB = DateTime.Now });
        list.Add(new Person { Name = "Peter", DOB = DateTime.Now });
        list.Add(new Person { Name = "Goran", DOB = DateTime.Now });
        list.Add(new Person { Name = "Markus", DOB = DateTime.Now });

        list.Add(new Dog { Name = "Sparky", Breed = "Unknown" });
        list.Add(new Dog { Name = "Little Kid", Breed = "Unknown" });
        list.Add(new Dog { Name = "Zorro", Breed = "Unknown" });

        foreach (var item in list)
            Console.WriteLine(item.Speek());

        list = ReCalculateDOB(list);

        foreach (var item in list)
            Console.WriteLine(item.Speek());
    }

Где вы хотите пересчитать дни рождения всехМлекопитающие.И реализации вышеупомянутого выглядят так:

internal interface Mammal
{
    string Speek();
}

internal class Person : Mammal
{
    public string Name { get; set; }
    public DateTime DOB { get; set; }

    public string Speek()
    {
        return "My DOB is: " + DOB.ToString() ;
    }
}
internal class Dog : Mammal
{
    public string Name { get; set; }
    public string Breed { get; set; }

    public string Speek()
    {
        return "Woff!";
    }
}

Итак, в основном вам нужно использовать Relfection, который представляет собой механизм для проверки типов и получения свойств типов и других подобных вещей ввремя выполнения.Вот пример того, как вы добавляете 10 дней к вышеприведенным DOB для каждого млекопитающего, получившего DOB.

static List<Mammal> ReCalculateDOB(List<Mammal> list)
{
    foreach (var item in list)
    {
        var properties = item.GetType().GetProperties();
        foreach (var property in properties)
        {
            if (property.PropertyType == typeof(DateTime))
                property.SetValue(item, ((DateTime)property.GetValue(item, null)).AddDays(10), null);
        }
    }

    return list;
}

Просто помните, что использование отражения может быть медленным и вообще медленным.

Однако вышеперечисленное напечатает это:

My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
My DOB is: 2010-03-22 09:18:12
Woff!
Woff!
Woff!
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
My DOB is: 2010-04-01 09:18:12
Woff!
Woff!
Woff!
12 голосов
/ 22 марта 2010

Это называется Отражение.

var t = this;
var props = t.GetType().GetProperties();
foreach (var prop in props)
{
    if (prop.PropertyType == typeof(DateTime))
    {
        //do stuff like prop.SetValue(t, DateTime.Now, null);

    }
}
3 голосов
/ 22 марта 2010
class HasDateTimes
{
  public DateTime Foo { get; set; }
  public string NotWanted { get; set; }
  public DateTime Bar { get { return DateTime.MinValue; } }
}

static void Main(string[] args)
{
  foreach (var propertyInfo in 
    from p in typeof(HasDateTimes).GetProperties()
      where Equals(p.PropertyType, typeof(DateTime)) select p)
  {
    Console.WriteLine(propertyInfo.Name);
  }
}
1 голос
/ 22 марта 2010

посмотрите на отражение, но в основном вы делаете это

obj.GetType (). GetProperties (.. Instance | ..Public), и вы получили список определенных свойств .. проверьте тип значения свойства и сравните его с typeof (DateTime).

0 голосов
/ 03 июня 2016

Эй, этот вопрос немного старше, но вы можете использовать это:

внутри класса (выбор всех значений) - установка значений будет выполняться без приведения, это просто для выбора:

(from property in this.GetType().GetProperties()
                    where property.PropertyType == typeof(DateTime)
                    select property.GetValue(this)).Cast<DateTime>()

вне класса будет:

var instance = new MyClass();
var times = (from property in instance.GetType().GetProperties()
                        where property.PropertyType == typeof(DateTime)
                        select property.GetValue(instance)).Cast<DateTime>()

Для получения максимального значения Datetime я запускаю этот

var lastChange = (from property in this.GetType().GetProperties()
                        where property.PropertyType == typeof(DateTime)
                        select property.GetValue(this)).Cast<DateTime>().Max();
0 голосов
/ 22 марта 2010

Если вас беспокоит влияние рефлексии на производительность, вас может заинтересовать Fasterflect , библиотека для упрощения и ускорения запросов и доступа к членам.

Для instace код MaxGuernseyIII можетпереписать с помощью Fasterflect следующим образом:

var query = from property in typeof(HasDateTimes).Properties()
            where property.Type() == typeof(DateTime)
            select p;
Array.ForEach( query.ToArray(), p => Console.WriteLine( p.Name ) );

Fasterflect использует легковесную генерацию кода для ускорения доступа (в 2-5 раз или с почти собственной скоростью, если вы кешируете и вызываете сгенерированныйделегаты напрямую).Запросы для членов обычно проще и удобнее, но не быстрее.Обратите внимание, что эти цифры не включают значительные начальные издержки JIT-компиляции сгенерированного кода, поэтому прирост производительности становится видимым только для повторных обращений.

Отказ от ответственности: я участвую в проекте.

0 голосов
/ 22 марта 2010

Для очень быстрых ответов и указателей на этот вопрос, и если у вас есть PowerShell (Vista / Windows 7, Windows 2008 уже установил его), вы можете просто запустить консоль и для DateTime, например, сделать

Get-Date | Get-Member

В котором будут перечислены члены экземпляра DateTime.Вы также можете посмотреть на статические элементы:

Get-Date | Get-Member -Static
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...