我在我的项目中使用了一千个封闭的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中设置的值?可能吗?
令人惊讶的是解决你的问题的一种方式.它不漂亮,但它满足你的问题的约束.
步骤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.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |