gpt4 book ai didi

dynamic - C# ‘dynamic’ 无法访问另一个程序集中声明的匿名类型的属性

转载 作者:行者123 更新时间:2023-12-02 08:50:39 27 4
gpt4 key购买 nike

只要我在与 Program 类相同的程序集中有类 ClassSameAssembly ,下面的代码就可以正常工作。但是,当我将类 ClassSameAssembly 移动到单独的程序集时,会引发 RuntimeBinderException (见下文)。有可能解决吗?

using System;

namespace ConsoleApplication2
{
public static class ClassSameAssembly
{
public static dynamic GetValues()
{
return new
{
Name = "Michael", Age = 20
};
}
}

internal class Program
{
private static void Main(string[] args)
{
var d = ClassSameAssembly.GetValues();
Console.WriteLine("{0} is {1} years old", d.Name, d.Age);
}
}
}

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“对象”不包含“名称”的定义

at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at ConsoleApplication2.Program.Main(String[] args) in C:\temp\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:line 23

最佳答案

我认为问题在于匿名类型是作为内部生成的,因此绑定(bind)器并不真正“了解”它本身。

尝试使用 ExpandoObject 代替:

public static dynamic GetValues()
{
dynamic expando = new ExpandoObject();
expando.Name = "Michael";
expando.Age = 20;
return expando;
}

我知道这有点难看,但这是我目前能想到的最好的...我认为你甚至不能使用对象初始值设定项,因为虽然它是强类型的 ExpandoObject 编译器将不知道如何处理“Name”和“Age”。您也许能够做到这一点:

 dynamic expando = new ExpandoObject()
{
{ "Name", "Michael" },
{ "Age", 20 }
};
return expando;

但这也好不了多少...

可能编写一个扩展方法,通过反射将匿名类型转换为具有相同内容的扩展。然后你可以写:

return new { Name = "Michael", Age = 20 }.ToExpando();

不过这太可怕了:(

关于dynamic - C# ‘dynamic’ 无法访问另一个程序集中声明的匿名类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2630370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com