【问题标题】:Can we add a method to an anonymous type that refers to the anonymous type's members? [duplicate]我们可以向匿名类型添加一个引用匿名类型成员的方法吗? [复制]
【发布时间】:2014-07-16 01:11:41
【问题描述】:

代码示例并不适用。它们旨在说明我尝试做我认为可能的事情的方式。

// Error: The name First does not exist...
var Contact = new
{
    First = "",
    Last = "",            
    FullName = First + " " + Last
};

// Error: Cannot assign lambda expression to anonymous type property
var Contact = new
{
    First = "",
    Last = "",
    FullName = () => { }
};

【问题讨论】:

  • var Contact = new { FullName = (Func<string>)(() => "foo")};

标签: c# anonymous-types


【解决方案1】:

Visual Studio 2013

匿名类型包含一个或多个公共只读属性。不 其他种类的类成员,例如方法或事件,都是有效的。 用于初始化属性的表达式不能为空, 匿名函数或指针类型。

其实你可以:MSDN Documentation:

        var fName = "First Name";
        var lName = "Last Name";

        var t = new
        {
            FirstName = "First Name",
            LastName = "Last Name",
            FullName = new Func<string>(() => { return fName + lName; })

        };

根据您对 TypeSafety 的需求程度,您也可以执行以下操作:

dynamic v = new ExpandoObject();

v.FirstName = "FName";
v.LastName = "LName";
v.FullName = new Func<string>(() => { return v.FirstName + " " + v.LastName; });

虽然老实说,我可能只是在方法的父类中使用这些属性和方法创建一个nested type。两者都可以,如果仅在其中使用内部类,则不会弄乱项目的其余部分。

【讨论】:

  • “匿名类型包含一个或多个公共只读属性。” --- 他们实际上是指properties 还是其他东西(可能是字段)?
  • @zerkms 我尝试使用 get 和 set 添加属性。 Visual Studio 拒绝了它。
  • @Shaun Luttin:我知道,这更像是一个反问:-)
  • @zerkms 不用担心。我有一勺阿斯伯格综合症——一切都是真实的。
  • 您必须记住的是,JavaScript 和 C# 是两种完全不同的语言。它们看起来一样,但完全不同。 C# 基于 C 和静态类型,JavaScript 基于 LISP。所有 JavaScript 对象实际上都只是 HashTables,并且在编译时不会强制执行太多操作。
【解决方案2】:

不,你不能。

原因是匿名类型是临时的,因此您可以以简洁的方式处理投影结果,而无需创建显式类型来保存转换和投影一组数据的结果。

【讨论】:

  • 能否提供官方文档的链接。然后我会将其标记为答案。
  • @ShaunLuttin:凯文的回答有那个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多