繁体   English   中英

如何扩展密封类属性

[英]How to Extend a Sealed Class Property

假设您在编译文件(dll)中有一个密封的类,并且该类具有一个只读的公共属性,如下所示:

public sealed class MyClass
{
    public MyClass();

    public Guid id { get; }
}

然后添加对您的项目的引用。

我的问题是:有什么方法可以将设置器添加到Property ID?

我真正需要的是为此属性分配一个值。

让我解释一下。 我们有一个独立的Web应用程序(A),该应用程序使用两个运行良好的dll发出对外部应用程序(B)的Web服务请求。 App B具有2个几乎包含相同类的不同dll。 应用程序A使用两个dll发出请求。 现在,我们为彼此“兼容”(或至少具有相同名称)的类创建一个新的库,以便仅使用一个类。 现在,我看到在一个dll中,该类MyClass的属性ID为read / write,另一方面,另一个DLL的属性与我先前向您展示的一样只读。

首先用反射器或类似工具反汇编dll。 然后找出吸气剂的工作原理。 幸运的是,它正在读取一个字段,但没有其他内容,但是如果它做的事情更复杂,那么在创建二传手中您将有更多工作要做。 可以说它确实是一个字段,该字段称为_privateGuidField

创建一个类,该类定义扩展方法SetId(this MyClass obj, Guid newID) ,该方法获取该FieldInfo并在其上调用SetValue

这仅适用于完全信任的代码。

然后坐下来等待类,您刚刚将其保证代码的不变式粉碎了,以一种非常奇怪的方式进行了操作。 如果创建了该类,请不要向创建它的人抱怨,因为您只是将他们的代码撕裂了,所以没有必要抱怨它是否不再起作用。

没有合法的方法:密封该类,并且该属性为只读。 如果该类使用id属性实现接口,则可以将该类包装到您的类中,并提供getter和setter。 从目前的情况来看,您唯一的选择是通过反思进行黑客攻击,这根本不是一个有效的选择。 根据属性的实现方式,即使进行反射也可能无法实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM