在以下示例中,x.propertyX可以正常工作,而y.propertyX给我一个Microsoft.CSharp.RuntimeBinder.RuntimeBinderException,抱怨“ propertyX”未在“对象”中定义。

Program类中的CreateDynamic方法(如下所示)与Class1中的CreateDynamic方法(未显示)完全相同,但是Class1与Program位于不同的项目中。如果我将Class1移入Program的项目,则一切正常。

class Program
{
    public static object CreateDynamic()
    {
        return new { propertyX = "asdf" };
    }

    static void Main(string[] args)
    {
        dynamic x = CreateDynamic();
        Console.WriteLine(x.propertyX);

        dynamic y = Class1.CreateDynamic();
        Console.WriteLine(y.propertyX);


我需要做些什么才能使匿名类型作为动态类型跨dll工作?或者这不可能吗?

更新:首先,我发现可以使用ExpandoObjects解决该问题,然后将其“转换”为动态,但与之相比,ExpandoObjects的实例化效果不佳。

new { key1 = val1, key2 = val2 }


匿名类型提供的样式。

最佳答案

匿名类型是在其内部创建的程序集的内部。如果您对源代码有控制权,则可以将其设为Friend Assemblies

[assembly:InternalsVisibleTo("TheOtherAssembly")]


但是有drawbacks

10-06 01:03