让我们说在我的.NET类的构造函数中,我想编写实际上会动态地向我的类添加方法的代码。所以现在当我反思我的课时,我会看到方法,就像我第一次构建项目时那样,方法不存在
我怎样才能做到这一点?
我一直在查找CodeDom,但它有点令人困惑
答案 0 :(得分:3)
装入装配体后,无法更改装配体。您可以使用Reflection.Emit或CodeDom动态编译新程序集,其类似于您的类+额外方法,但它不会更改现有(至少在运行时存在)类。潜在地,你可以在一个单独的AppDomain中加载你的类,创建一个新的类,它是附加的“副本”,然后在你的主AppDomain中加载该程序集(并卸载你加载原始类的那个)。你仍在创建一个新类,而不是添加到现有类,但效果会相似。
但是,您可以在加载类之前使用代码注入来插入代码。 .NET有一些代码注入框架可以帮助解决这个问题......但这与您的具体问题不同。
答案 1 :(得分:1)
你必须使用Reflection.Emit或Mono.Cecil或PostSharp。
所有这些都很容易学习......
答案 2 :(得分:0)
我......无法想象你为什么要这样做。
你能解释一下你想要的原因吗?
相反,尝试使用相同接口的不同具体实现,或者如果共享大部分代码,则尝试使用抽象类。
答案 3 :(得分:0)
你可以在不使用CInject(Codeplex的开源)学习任何额外内容的情况下做到这一点。编写要在C#或VB.NET中注入的代码,然后通过CInject处理它以添加到托管程序集中。
答案 4 :(得分:0)
我同意使用appdomain domcomplie函数的@ reed-copsey。您可以创建一个继承插件基类的插件类,您可以添加所需的所有类。当它在appdomain中编译时,它甚至可以为你提供注入该类的编码错误。然后它不会编译那个specfic类。至少你会知道代码有问题。