【问题标题】:How to extend a static class in C# [duplicate]如何在 C# 中扩展静态类 [重复]
【发布时间】:2013-03-25 11:00:15
【问题描述】:

我正在使用 Microsoft 的 Visual Studio 单元测试框架(因此我必须使用该项目)。我非常想念一些更高级的断言,例如您在MBUnit 中找到的AreElementsEqual

我想做它们。

由于该类是静态的,我无法从它继承(创建SuperAssert),也无法添加扩展方法(因为它们是静态方法)。

我不想简单地创建另一个类并期望消费者使用两个不同的类。如何扩展课程?

【问题讨论】:

  • I can't add an Extension Method (as they're static methods). 为什么?您能否举一些代码示例说明为什么不能添加扩展方法?
  • 对于 AreElementsEqual,您是否检查过 CollectionAssert 不能满足您的需求?
  • @IlyaIvanov:您根本无法添加可以在类名而不是实例上调用的扩展方法。我看不到您需要代码示例来做什么 - 或者它应该显示什么。
  • @DanielHilgarth 你的意思是非静态方法?扩展方法是静态方法,可以用来扩展\添加更多行为,我猜是 OP 想要的。
  • @IlyaIvanov:扩展方法是静态方法。这是正确的。但是它们只能在对象的实例上调用,而不能在类型名称上调用。示例:您不能创建允许此代码的扩展方法:int.MyExtension()。你只能创建一个可以这样调用的:int i = 0; i.MyExtension();

标签: c# unit-testing inheritance static


【解决方案1】:

你不能。您必须创建一个新的。

或者你可以创建一个现有的包,比如Fluent Assertions

【讨论】:

    【解决方案2】:

    由于类是静态的,你不能像你说的那样,使用扩展方法向类“添加”更多方法。

    您可以在合理范围内做的最接近的事情如下:

    public static class AssertExtensions
    {
        public static void SuperAssert(bool expression)
        {
            // etc...
        }
    }
    

    如果你正在制作一个工具库,要求用户使用另一个类应该不是问题。

    如果您仍然担心,为什么不为您的测试创建一个基类并让用户使用其中的方法进行断言?

    例如:

    public class TestBase
    {
        protected void AreEqual(object obj1, object obj2)
        {
            Assert.AreEqual(obj1, obj2); // etc...
        }
    
        protected void SuperAssert(bool expression)
        {
            // etc...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多