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)