为什么我不能通过dynamic关键字访问从函数返回的匿名类型的属性?

Mar*_*eIV 8 c# dynamic anonymous-types

我有一个函数返回一个像这样的匿名类型(简化为说明目的)...

public object GetPropertyInfo()
{
    return new {
        PropertyName = "Foo",
        Value = "Laa"
    };
}
Run Code Online (Sandbox Code Playgroud)

我这样做的时候......

dynamic pi = GetPropertyInfo();
Console.WriteLine(pi);
Run Code Online (Sandbox Code Playgroud)

它输出这个(就像我在前一个窗口中做'?pi'一样)......

{ PropertyName = "A", Value = 44 }
    PropertyName: "A"
    Value: 44
Run Code Online (Sandbox Code Playgroud)

但如果我尝试这样做......

   string propertyName = pi.PropertyName;
Run Code Online (Sandbox Code Playgroud)

...它编译但抛出运行时异常说

抛出异常:System.Core.dll中的"Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"

附加信息:'object'不包含'PropertyName'的定义

是什么赋予了?我在这里错过了什么?

Str*_*ior 10

问题是匿名类型是内部的,这意味着您无法使用属于其dynamic创建者的项目访问属性访问者的属性.动态绑定将它们视为它所知道的最接近的公共继承类型 - object.

要解决此问题,您可以声明一个公共类型来表示您希望在匿名类型中找到的值.无论如何,这可能是一个好主意,因为您显然希望在代码的其他部分使用返回的属性.使用声明的类型还可以使您保持类型安全,从而dynamic完全避免使用.

如果您绝对必须dynamic在这里使用s,那么下一个最佳选择可能是更改您的AssemblyInfo.cs文件,以使您尝试从以下项目访问它们的项目可以访问内部属性:

[assembly:InternalsVisibleTo("MyOtherProject")]
Run Code Online (Sandbox Code Playgroud)