代码之家  ›  专栏  ›  技术社区  ›  friism

跨程序集边界返回/使用动态匿名类型

  •  25
  • friism  · 技术社区  · 14 年前

    下面的代码非常有用。如果 Get Use 方法位于不同的程序集中,代码失败并出现RuntimeBinderException。这是因为.Net运行时系统只保证匿名类型的公共性( <string, int> 在本例中)在程序集中。

    有没有办法欺骗运行时系统来克服这个问题?我可以在上的调试器中检查对象 并且调试器可以看到相关的属性。

    class Program
    {
        static void Main(string[] args)
        {
            UsePerson();
            Console.ReadLine();
        }
    
        public static void UsePerson()
        {
            var person = GetPerson();
    
            Console.WriteLine(person.Name);
        }
    
        public static dynamic GetPerson()
        {
            return new { Name = "Foo", Age = 30 };
        }
    }
    
    5 回复  |  直到 14 年前
        1
  •  34
  •   Reed Copsey    14 年前

    ExpandoObject 而不是匿名类型。这将允许您安全地跨越部件边界:

    public static dynamic GetPerson()
    {
        dynamic person = new ExpandoObject();
        person.Name = "Foo";
        person.Age = 30;
    
        return person;
    }
    

    一般来说,匿名类型实际上只能在生成它们的同一方法中使用。一般来说,从方法返回匿名类型将导致比它解决的问题更多的问题。

        2
  •  8
  •   jpbochi    8 年前

    post . 可以在程序集中放置一个自定义属性,该属性定义匿名类型,允许另一个程序集访问其内部。

    另一种解决方案是返回公共类的对象(具有公共属性)。当然,这将扼杀匿名类型的优势。

    第三种解决方案是使用 ExpandoObject 根据建议 里德·科普西 .

    IDynamicMetaObjectProvider 接口并通过反射访问装饰对象。可能,这个东西已经被外面的人实现了。

        4
  •  1
  •   gino.leovac    8 年前

    这是一个穷人的解决办法;Json,因为序列化往返会生成对您的/工作程序集可见的动态类型实例。

    public static class TypeExt
    {
      // roundtrip json serialization to enable access to dynamic members and properties originating from another assembly
      public static T JClone<T>( this T source ) { return JsonConvert.DeserializeObject<T>( JsonConvert.SerializeObject( source ) ); }
    }
    
        5
  •  0
  •   jbtule    13 年前

    即兴界面

    http://code.google.com/p/impromptu-interface/

    将允许您跨边界使用匿名类型实例,但您必须声明一个与其签名匹配的接口,或者至少声明您希望从其签名访问的接口。