首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在一个类中找到DateTime类型的所有属性?

如何在一个类中找到DateTime类型的所有属性?
EN

Stack Overflow用户
提问于 2010-03-22 16:01:12
回答 7查看 28.6K关注 0票数 25

我需要调整一堆对象的日期时间。

我想遍历类的属性,如果类型为dateTime,则相应地进行调整。

有没有什么“描述类型”是我可以使用的?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-22 16:18:29

您可以使用reflection来实现这一点。

您的场景可能如下所示:

代码语言:javascript
复制
    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());
    }

你想重新计算所有哺乳动物的生日。上面的实现如下所示:

代码语言:javascript
复制
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天。

代码语言:javascript
复制
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;
}

只需记住,使用反射可能会很慢,而且通常是很慢的。

但是,上面的代码将打印以下内容:

代码语言:javascript
复制
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!
票数 29
EN

Stack Overflow用户

发布于 2010-03-22 16:04:31

这叫做反射。

代码语言:javascript
复制
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);

    }
}
票数 15
EN

Stack Overflow用户

发布于 2010-03-22 16:08:20

代码语言:javascript
复制
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);
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2490674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档