从不同库中的方法从`dynamic`结果读取属性时的RuntimeBinderException

时间:2013-08-04 03:14:07

标签: c# .net dynamic

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

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

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

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

我在阅读RuntimeBinderException时收到'object' does not contain a definition for 'test'的{​​{1}}。

当我将方法移动到调用库时,相同的代码按预期工作。

2 个答案:

答案 0 :(得分:4)

匿名类型不公开,dynamic并不意味着你可以闯入内部/私人并使用它。但反思确实如此。

您可以允许其他程序集使用属性:

来使用内部类型
// specified in assembly, defining MyLibrary1 class
[assembly: InternalsVisibleTo("Assembly, where you call MyLibrary1.GetObjects()")]

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

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

答案 1 :(得分:0)

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

我通过控制台应用程序和类库确认了这一点,它们都针对.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属性并不适用于它们。