【问题标题】:Overriding methods in compiled library without inheritance in C#在 C# 中没有继承的情况下覆盖编译库中的方法
【发布时间】:2010-07-01 14:11:54
【问题描述】:

我有一个 C# 类库,它被编译成一个 dll。是否可以在不触及原始源代码或通过继承创建新类的情况下更改特定项目的编译类方法中的某些内容?

【问题讨论】:

    标签: c# overriding


    【解决方案1】:

    通过Moles 等框架使用的技术,使用代码重写在技术上是可行的。但是,我不会推荐这个。相反,您最好使用一个包装类,该类将调用委托给包含的对象,并仅针对必须更改的特定方法覆盖您所追求的行为。

    【讨论】:

    • 谢谢,你能给我一个包装类的例子吗?我遇到的另一个问题是编译的类需要调用这些类中的其他方法,所以如果我覆盖它们,它们需要调用被覆盖的方法。
    • 包装仅适用于您使用该类,因为您可以在访问它时构造和使用包装器。包装类上的其他方法不会知道包装器,因此它不会按您的意图工作。您可能需要重新考虑您的设计以完全回避这个问题,因为进行 IL 重写以注入弯路可能会使您的代码难以维护。
    【解决方案2】:

    基本上没有。

    正如你所说,你最好的选择应该是派生你自己的类并覆盖有问题的方法(假设它不是密封的)。

    您可以使用extension method 向类添加功能。

    【讨论】:

      【解决方案3】:

      我不这么认为。您可以创建一个扩展方法,尽管它无法访问私有/受保护/内部成员。

      【讨论】:

        【解决方案4】:

        如果您有源代码但不想更改它 - 分支它。

        如果您可以接受稍微不同的方法签名,请编写扩展方法。

        如果上述方法都不适合您,并且类必须具有相同的名称,请使用同名的类继承、覆盖并将该类放置在不同的命名空间中。通过命名空间区别于原来的。只是正常继承可能会更容易维护,不过......

        如果你还是不开心,我帮不了你。

        【讨论】:

          【解决方案5】:

          据我所知,不是。你能详细解释一下你的场景,为什么你需要做这样的事情吗?

          【讨论】:

            【解决方案6】:

            通过一些涉及反射和reflection emit 的大量黑客攻击进入新的application domain,当然。但我怀疑这是否值得。

            【讨论】:

              猜你喜欢
              • 2010-11-03
              • 2020-09-08
              • 1970-01-01
              • 2016-01-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-05
              相关资源
              最近更新 更多