2

我有一个静态方法,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'当我阅读时b.test

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

4

2 回答 2

4

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

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

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

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

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

于 2013-08-04T04:14:35.257 回答
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财产对他们俩都不起作用。

于 2013-08-04T03:41:46.820 回答