首页 > 解决方案 > c#匿名对象,为什么有时只包含字段定义?

问题描述

为什么我可以在这里立即访问匿名对象属性:

    public object ComputeStats()
    {
        var obj = new
        {
            avg = 2,
            hi = 3,
            lo = 1
        };

        Console.WriteLine(obj.avg);

        return obj;
    }

但不是在这里(编译器错误'object'不包含'avg'的定义):

    public void DisplayStats()
    {
        object stats = ComputeStats();
        Console.WriteLine("average: " + stats.avg);
    }

一种解决方法是将 stats 声明为dynamic,但大多数人会说只为该对象创建一个类/类型。我宁愿使用匿名对象,但不想为了方便而开始使用动态对象。

标签: c#anonymous-types

解决方案


这并不特定于匿名类型。一切都继承自object这意味着您可以将任何内容隐式转换为object.

调用返回匿名类型的方法并将其分配给声明为的变量object与执行此操作相同:

object obj = new { avg = 2, hi = 3, lo = 1 };

object没有 , 等属性avghi因此 Visual Studio 不会显示它们,如果您键入它们,它们将不会编译。

为了说明使用匿名类型以外的东西:

var s = "Hello!";
object o = s;

只有一个string。两者都so一个string. 但是s被转换为 astring并且o被转换为object.

所以你可以这样做:

var s = "Hello!";
object o = s;
var l = s.Length;

...但你不能这样做:

var s = "Hello!";
object o = s;
var l = o.Length; // object doesn't have a Length property.

如果你这样做:

    var obj = new { avg = 2, hi = 3, lo = 1};

...usingvar表示类型是推断出来的。无论您分配给它什么,这就是类型。在这种情况下,在幕后,编译器实际上是在创建一个新类型,因此它的行为就像您已经定义了具有这些属性的类型一样。

像这样的匿名类型在方法中使用很方便,但它们并不意味着在方法之间传递值。为此,类、结构或元组更好。


推荐阅读