如何扩展密封类财产

时间:2011-12-09 20:38:18

标签: c# .net

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

public sealed class MyClass
{
    public MyClass();

    public Guid id { get; }
}

然后添加对项目的引用。

我的问题是:有没有办法将属性ID添加到setter?

我真正需要的是为此属性指定一个值。

让我再解释一下。我们有一个独立的网络应用程序(A),它使用两个运行良好的dll向外部应用程序发出Web服务请求(B)。 App B有两个不同的dll,几乎包含相同的类。应用程序A使用两个dll来发出请求。现在我们正在为那些彼此“兼容”(或者至少具有相同名称)的类创建一个新库,这样我们只能使用一个类。现在,我在一个dll中看到,这个类MyClass的属性id是读/写,另一方面,另一个dll的属性就像我之前给你看的那样只读。

2 个答案:

答案 0 :(得分:3)

首先用反射器或类似装置拆卸dll。 然后弄清楚吸气剂是如何工作的。幸运的是,它正在阅读一个字段而没有别的,但如果它正在做任何更复杂的事情,那么你在创建一个setter时还有更多工作要做。假设它确实是一个字段,该字段称为_privateGuidField

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

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

然后坐下来等待那些你刚刚被打破的代码保证不变的班级以一种非常奇怪的方式行为不端。不要向创建课程的人抱怨,因为你只是将他们的代码分开,所以如果它不再有用就没有抱怨。

答案 1 :(得分:2)

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