如何扩展密封类属性
本文关键字:密封类 属性 扩展 何扩展 | 更新日期: 2023-09-27 18:17:16
假设在编译文件(dll)中有一个密封的类,该类有一个只读的公共属性,如下所示:
public sealed class MyClass
{
public MyClass();
public Guid id { get; }
}
,然后你添加一个引用到你的项目。
我的问题是:有没有办法添加到属性id setter?
我真正需要的是给这个属性赋一个值。
让我再解释一下。我们有一个独立的web应用程序(A),它使用两个dll运行良好,向外部应用程序(B)发出web服务请求。应用程序B有两个不同的dll,几乎包含相同的类。应用A使用两个dll来发出请求。现在我们正在为那些彼此"兼容"(或至少具有相同名称)的类创建一个新库,以便我们只有一个类可以使用。现在,我看到在一个dll中,类MyClass的属性id为read/write,另一方面,另一个dll的属性id为read-only,就像我之前展示的那样
首先用反射器或类似的方法反汇编dll。然后弄清楚getter是如何工作的。幸运的是,它只读取一个字段,没有其他内容,但如果它要做更复杂的事情,那么你在创建setter时就需要做更多的工作。假设它确实是一个字段,并且该字段称为_privateGuidField
。
创建一个类,定义一个扩展方法SetId(this MyClass obj, Guid newID)
,该方法获取该字段的FieldInfo
并在其上调用SetValue
。
这只适用于完全信任的代码。
然后坐下来,等待您刚刚破坏了其代码保证不变量的类以一种非常奇怪的方式出错。不要向创建这个类的人抱怨,因为你只是把他们的代码拆开了,所以如果它不再工作了,抱怨也没有意义。
没有合法的方法可以这样做:类是密封的,属性是只读的。如果这个类实现了一个带有id
属性的接口,您可以将这个类包装到您的类中,并提供一个getter和setter。然而,就目前而言,你唯一的选择就是通过反射进行破解,而这根本不是一个有效的选择。根据属性的实现方式,即使使用反射也可能无法实现。