从不同库中方法的“dynamic”结果读取属性时出现RuntimeBinderException

本文关键字:属性 读取 结果 RuntimeBinderException dynamic 方法 | 更新日期: 2023-09-27 18:26:06

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

public static dynamic GetObjects()
{
return new { test = "something" };
}

但当我从MyLibrary2访问上述方法时,调试器会显示正确返回的值和对象。

dynamic b = MyLibrary1.GetObjects();
string name = b.test;

当我读b.test时,我得到一个RuntimeBinderException,上面写着"'object' does not contain a definition for 'test'"。

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

从不同库中方法的“dynamic”结果读取属性时出现RuntimeBinderException

匿名类型不是公共的,dynamic并不意味着你可以闯入内部/私有的东西并使用它。不过反射可以。

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

// specified in assembly, defining MyLibrary1 class
[assembly: InternalsVisibleTo("Assembly, where you call MyLibrary1.GetObjects()")]

完全解决了动态使用匿名类型的问题。

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

我不确定在哪里包含这些附加信息。

我用控制台应用程序和类库证实了这一点,它们都以.NET4为目标,都引用了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属性对他们两个都不起作用。