覆盖dll类属性集

Ren*_*újo 4 c#

我在我的项目中使用了一千个封闭的DllClass实例.

public sealed class DllClass 
{
    public DllClass();
    public string DllClassProperty {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

DllClassProperty集使用了数千次,如果在Web.config上设置了参数,我需要覆盖值集.

我发现这个接口INotifyPropertyChanged,但我不能使用它,因为我无法访问该类,我无法扩展它.

我在想,如果有办法做这样的事情,但我认为这在C#中是不可能的:

public class OnSetPropertyListener<DllClass>
{
    public void OnSetProperty(PropertyInfo propertyInfo, DllClass instance) 
    {
        // set another value, for example: "new value"
    }
}
Run Code Online (Sandbox Code Playgroud)

如何覆盖DllClassProperty中设置的值?可能吗?

Hei*_*nzi 6

令人惊讶的解决你的问题的一种方式.它不漂亮,但它满足你的问题的约束.

步骤1:创建一个包装器DllClass,即一个新类MyDllClassWrapper,其行为与DllClass您要实现的更改完全相同.这通常通过重建公共接口DllClass并将所有操作转发到私有DllClass实例来完成.

现在您只需要MyDllClassWrapper在目前使用的任何地方使用DllClass.你在评论中提到你不想改变所有这些调用,所以让我们自动化:

第2步:使用Substitute.Fody自动替换所有引用DllClass通过引用MyDllClassWrapper一个编译后步骤:

[assembly: Substitute(typeof(DllClass), typeof(MyDllClassWrapper))]
Run Code Online (Sandbox Code Playgroud)

但是请注意,读取代码的每个人都会彻底混淆,因为源代码指向DllClass,但是MyDllClassWrapper使用它.因此,我建议您仅将此技术用作临时解决方法,直到您找到时间干净地替换所有对DllClass引用的引用MyDllClassWrapper.