【发布时间】:2011-09-27 15:11:29
【问题描述】:
我有一个容器类Foo<TInterface>,它在其构造函数中接受一个任意接口类型参数和一个字符串“strCode”。
在实例化 Foo 时,strCode 通过 CSharpCodeProvider 编译,通过反射,适当的类型位于新编译的代码中,然后转换为 TInterface 类型并在 Foo 中提升到属性 TInterface 栏。
这工作正常,客户端可以访问 foo.bar 没问题。但是,Foo 还包含(在其他方法中)一个名为 Recompile 的方法,它基本上以上述方式获取并编译一个新的代码字符串。这也可以正常工作,但这意味着客户端最终会得到一个 Foo API,其中方法组织如下:
foo.bar.MakeCoffee
foo.bar.DoMagic
foo.Recompile
我更喜欢:
foo.MakeCoffee
foo.DoMagic
foo.Recompile
换句话说,我想返回一个对通用接口方法和 Foo API 方法都具有顶级访问权限的类实例。
理想情况下,返回 Foo<TInterface> 的实例会很好,但我知道 C# 泛型不允许这样做。如果需要,我很乐意发布代码,但首先要确保由于 C# 的静态类型性质,我没有在错误的树上吠叫。
【问题讨论】:
-
什么版本的 C#?您可以使用 C# 4 中新的动态语言支持来完成这项工作。
-
如果可能的话,我宁愿使用 C# 3.5,如果仅仅是因为(根据我的经验)这个版本的 CSharpCodeProvider 的编译速度比 4.0 快 15%。但是,如果不是太复杂,我会热衷于询问动态解决方案。您对我应该看哪里或应该采取的一般方法有什么建议吗?
标签: c# generics reflection interface