跨dll边界访问匿名/动态类型的属性会产生RuntimeBinderException

时间:2011-10-05 04:08:19

标签: c# dynamic expandoobject

在下面的示例中, x.propertyX 工作正常,而 y.propertyX 为我提供了 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ,抱怨'propertyX'没有在'object'中定义。

Program类中的CreateDynamic方法(如下所示)和Class1中的方法(未显示)完全相同,但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中作为动态类型工作 - 或者这是不可能的?

更新: Fwiw,我发现我可以使用ExpandoObjects解决这个问题,然后我将其“强制转换”为动态,但与

new { key1 = val1, key2 = val2 }

匿名类型提供的样式。

1 个答案:

答案 0 :(得分:1)

匿名类型是创建它们的程序集的内部。如果您可以控制源代码,则可以使它们Friend Assemblies

[assembly:InternalsVisibleTo("TheOtherAssembly")]

但有drawbacks