【问题标题】:Accessing properties of an anonymous types in C#?在 C# 中访问匿名类型的属性?
【发布时间】:2013-07-19 17:22:55
【问题描述】:

假设我为具有姓名和出生日期作为属性的人创建了一个匿名类型:

var person = new{ Name = "Mike", BirthDate = new DateTime(1990, 9, 2) };

后来,决定添加一个返回人年龄的方法。

var person = new { Name = "Mike", 
                   BirthDate = new DateTime(1990, 9, 2), 
                   GetAge = new Func<int>(() => { return /* What? */; }) };

如何访问属性BirthDate 以便计算年龄?我尝试使用this,但它当然没有用。

【问题讨论】:

  • 因为匿名类型属性是只读的,我认为这样做没有意义。您可以直接在GetAge 属性实现中使用new DateTime(1990, 9, 2),不会有任何区别。
  • 据我所知,你不能。
  • @dpp 为它创建适当的类。匿名类型仅用于数据的简单和临时存储。对于其他一切,您应该创建新类型。
  • OT:确实应该有一种方法可以接受@JonSkeet 的评论作为正确答案。
  • 这是一个很好的问题,但显然有很多方法可以通过使用其他方法来解决这个问题...@newStackExchangeInstance no dynamic 在这里不起作用。

标签: c# anonymous-types


【解决方案1】:

你不能。您必须创建一个 Person 类才能拥有这样的功能:

    class Person {
        public string Name { get; set; }
        public DateTime BirthDate { get; set; }
        public TimeSpan Age {
            get {
                // calculate Age
            }
        }
    }

    var person = new Person {
            Name = "Mike",
            BirthDate = new DateTime(1990, 9, 2))
    };

编辑:另一种选择是为DateTime 创建一个extension method

    public static TimeSpan GetAge(this DateTime date) {
        // calculate Age
    }

    var person = new {
            Name = "Mike",
            BirthDate = new DateTime(1990, 9, 2))
    };

    TimeSpan age = person.BirthDate.GetAge();

【讨论】:

  • 我实际上不需要关于如何声明类和属性的教程,我正在研究匿名类型和动态对象。不过,我感谢大家的帮助。
  • +1 表示扩展方法。虽然,它也会将GetAge 方法添加到其他DateTime 对象中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
相关资源
最近更新 更多