C# 从不同库中的方法的“dynamic”结果读取属性时发生RuntimeBinderException

C# 从不同库中的方法的“dynamic”结果读取属性时发生RuntimeBinderException,c#,.net,dynamic,C#,.net,Dynamic,我在MyLibrary1中有一个静态方法,它返回一个动态对象 public static dynamic GetObjects() { return new { test = "something" }; } 但当我从MyLibrary2访问上述方法时,调试器会正确显示返回的值和对象 dynamic b = MyLibrary1.GetObjects(); string name = b.test; 我得到一个RuntimeBinderException,当我阅读b.test时,它说“对象”

我在
MyLibrary1
中有一个静态方法,它返回一个动态对象

public static dynamic GetObjects()
{
return new { test = "something" };
}
但当我从
MyLibrary2
访问上述方法时,调试器会正确显示返回的值和对象

dynamic b = MyLibrary1.GetObjects();
string name = b.test;
我得到一个
RuntimeBinderException
,当我阅读
b.test
时,它说“
对象”不包含“test”的定义


当我将方法移动到调用库时,同样的代码也会正常工作。

我不确定在何处包含这些附加信息


我通过控制台应用程序和类库确认了这一点,它们都以.NET 4为目标,都引用了
Microsoft.CSharp.dll
。我正在比较同一控制台应用程序中函数返回的结果与库返回的结果

调用
d.GetType().GetProperties()
时,它们都显示您定义的单个属性
test

毫不奇怪,这对他们两人都适用:

    static string GetStringPropertyValue(dynamic d, string propertyName)
    {
        Type t = d.GetType();

        return t.GetProperty(propertyName).GetValue(d, null);
    }

因此,我很困惑为什么这样做有效,但简单地获取
.test
属性并不适用于这两个属性。

我不确定在何处包含此附加信息


我通过控制台应用程序和类库确认了这一点,它们都以.NET 4为目标,都引用了
Microsoft.CSharp.dll
。我正在比较同一控制台应用程序中函数返回的结果与库返回的结果

调用
d.GetType().GetProperties()
时,它们都显示您定义的单个属性
test

毫不奇怪,这对他们两人都适用:

    static string GetStringPropertyValue(dynamic d, string propertyName)
    {
        Type t = d.GetType();

        return t.GetProperty(propertyName).GetValue(d, null);
    }

因此,我很困惑为什么这样做有效,但简单地获取
.test
属性并不适用于这两种类型。

匿名类型不是公共的,
动态的
并不意味着你可以进入内部/私有的东西并使用它。反射确实如此

您可以使用以下属性允许其他程序集使用内部类型:

// specified in assembly, defining MyLibrary1 class
[assembly: InternalsVisibleTo("Assembly, where you call MyLibrary1.GetObjects()")]
这完全解决了通过动态使用匿名类型的问题


请注意,这意味着指定的程序集可以访问所有内部类型。

匿名类型不是公共类型,
dynamic
并不意味着您可以拆分为内部/私有类型并使用它。不过反射可以

您可以使用以下属性允许其他程序集使用内部类型:

// specified in assembly, defining MyLibrary1 class
[assembly: InternalsVisibleTo("Assembly, where you call MyLibrary1.GetObjects()")]
这完全解决了通过动态使用匿名类型的问题


请注意,这意味着所有内部类型都可以由指定的程序集访问。

Wow,这确实非常奇怪。我对标题/问题进行了一些编辑,以更清楚地说明这是一个运行时异常。我通过控制台应用程序和类库确认了这一点,它们都以.NET 4为目标,并且都引用了
Microsoft.CSharp.dll
。正如OP所指出的,当我直接从控制台应用程序调用该方法时,这对我来说很好。但将完全相同的代码放入库中会导致异常。Paging@EricLippert!哇,这确实非常奇怪。我编辑了一点标题/问题,以更清楚地表明这是一个运行时异常。我用控制台应用程序和类库,都以.NET 4为目标,都引用了
Microsoft.CSharp.dll
。就像上面提到的OP一样,当我直接从控制台应用程序调用该方法时,这对我来说很好。但是将完全相同的代码放在库中会导致异常。Paging@EricLippert!签出这个答案-这意味着更标准跨程序集移动域实体的方法:签出此答案-它建议跨程序集移动域实体的更标准的方法: