【发布时间】:2011-09-05 06:51:46
【问题描述】:
我有一个有趣的问题。我需要动态包装静态类。 IE。将非静态实例返回给我的调用者。例如:
public object CreateInstance(string className) {
Type t = assembly.GetType(className);
if (IsStatic(t)) {
return CreateStaticWrapper(t);
} else {
return Activator.CreateInstance(t);
}
}
所以我需要的是关于如何实现CreateStaticWrapper 的指针。
注意:很遗憾,我不能使用动态对象。
那么我有哪些选择?我不是那么热衷于学习 IL 生成?如果 IL 生成(Reflection.Emit,或者现在有其他方法吗?)是要走的路,有人有指针吗?
编辑:重要的是要注意我可以返回代表字典。所以我可以为此使用Delegate.CreateDelegate,但我似乎无法弄清楚如何处理重载方法和通用方法。
Edit2:另一种选择是使用 Emit 将一个空的构造函数注入到类型中,还有指针吗?这甚至可以在标记为静态的类型上实现吗?静态关键字是否进入 IL?
Edit3:关于上下文,我将其传递给 javascript 环境,请参阅:my project。所以我希望能够(在 JavaScript 中):
var fileHelper = .create('System.IO.File');
if (fileHelper.Exists(fileName)) { fileHelper.Delete(fileName); }
谢谢大家。
【问题讨论】:
-
您的目标是创建静态类内容的副本吗?是否有静态类的非静态等价物(与静态类具有相同属性的非静态类?
-
包装器应该是什么样的?原类上对应静态成员的代理实例成员?
-
我已经编辑了 (3) 以获取一些上下文。基本上我将这个静态类传递给 javascript 环境。所以是的,代理需要具有相同的签名。我希望能够做到(在 javascript 中): var fs = .create('System.IO.File'); fs.Exists('文件名');
-
我会说去 IL 生成。创建代理是一个非常简单的场景。我实际上写了一篇关于它的博客文章:einarwh.posterous.com/patching-polymorphic-pain-at-runtime。场景不同,但解决方案几乎相同。
-
这听起来像是你在尝试做模拟。也许其中一个库提供了您正在寻找的内容。
标签: c# .net instance non-static static-class