通过reflection.emit访问匿名类

时间:2014-03-08 01:43:00

标签: c# reflection.emit

我正在尝试将匿名类强制转换为具有DuckTyping库(https://github.com/deftflux/DuckTyping)的接口。

public interface IStuff
{
    string Foo { get; }
    int Bar { get; }
}

var asd = new { Foo = "Hiho!" , Bar = 42};
var iAsd = DuckTyping.Cast<IStuff>(asd);
var foo = iAsd.Foo;
var bar = iAsd.Bar;

Library使用DynamicAssymbly和Reflection.Emit来动态生成实现接口的类。

不幸的是,这会导致MethodAccessException,因为匿名类是私有的,而DynamicAssembly中的类型不能访问私有成员(与DynamicMethod不同)。 见MSIL - how do you invoke a private method from MSIL?

我试过

  • 创建一个DynamicMethod,它调用匿名类的getter
  • 在DynamicAssembly中创建一个类型,它实现接口并调用DynamicMethod。

这导致了一个InvalidOperationException:“Eine globale Methode oder ein globales Feld kann nicht von einem anderen Modul importiert werden。” (无法从其他模块导入全局方法或全局字段。)

我想要的是什么:

  • 将匿名类动态转换为接口。
  • 不必手动编写包装类,这会破坏匿名类的目的
  • Reflection.Emit听起来很棒,因为在创建类型后它的运行时开销很低。

所以我的问题:

  • 是否有一些标志组合可以传递给DynamicAssembly,因此它会跳过可见性检查,类似于DynamicMethod?链接的问题+答案建议NO。
  • 是否有一种从DynamicAssembly中调用DynamicMethod的简单方法?这样,DynamicMethod可以调用私有成员并返回值。
  • 如果没有,还有其他建议吗?

0 个答案:

没有答案