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

本文关键字:属性 RuntimeBinderException 类型 动态 边界 dll 访问 | 更新日期: 2023-09-27 18:10:23

在下面的示例中,x。propertyX工作正常,而y。propertyX给了我一个Microsoft.CSharp.RuntimeBinder。RuntimeBinderException,报错'propertyX'没有在'object'中定义。

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

Update: Fwiw,我发现我可以绕过使用ExpandoObjects,然后我'cast'到动态,但ExpandoObjects是不太好实例化,当与

new { key1 = val1, key2 = val2 }

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

匿名类型是创建它们的程序集的内部类型。如果你可以控制源代码,你可以把它们变成友元程序集

[assembly:InternalsVisibleTo("TheOtherAssembly")]

但也有缺点