C# 如何在C中扩展静态类#
我使用的是微软的VisualStudio单元测试框架(因此我不得不使用该项目)。我非常缺少一些更高级的断言,比如C# 如何在C中扩展静态类#,c#,unit-testing,inheritance,static,C#,Unit Testing,Inheritance,Static,我使用的是微软的VisualStudio单元测试框架(因此我不得不使用该项目)。我非常缺少一些更高级的断言,比如arelementsequal,您可以在MBUnit中找到它们 我想做 由于该类是静态的,我无法从中继承(创建超级assert),也无法添加扩展方法(因为它们是静态方法) 我不想简单地创建另一个类,并期望消费者使用这两个不同的类。我怎样才能扩展这个类?你不能。你必须创建一个新的 或者您可以创建一个现有的包,例如。您不能。你必须创建一个新的 或者您可以创建一个现有的包,比如。由于类是静态
arelementsequal
,您可以在MBUnit
中找到它们
我想做
由于该类是静态的,我无法从中继承(创建超级assert
),也无法添加扩展方法(因为它们是静态方法)
我不想简单地创建另一个类,并期望消费者使用这两个不同的类。我怎样才能扩展这个类?你不能。你必须创建一个新的
或者您可以创建一个现有的包,例如。您不能。你必须创建一个新的
或者您可以创建一个现有的包,比如。由于类是静态的,您不能像您所说的那样,使用扩展方法向类“添加”更多的方法 在合理范围内,您可以做的最接近的事情如下:
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...
}
}
由于该类是静态的,所以不能像您所说的那样使用扩展方法向该类“添加”其他方法 在合理范围内,您可以做的最接近的事情如下:
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...
}
}
我不能添加扩展方法(因为它们是静态方法)。
为什么?您能否给出一些代码示例,说明为什么无法添加扩展方法?对于AreElementsEqual,您是否检查了不符合您需要的扩展方法?@IlyaIvanov:您无法添加可以对类名而不是实例调用的扩展方法。我不知道你需要什么样的代码样本,或者它应该显示什么。@DanielHilgarth你是说非静态方法?扩展方法是静态方法,可以用来扩展\添加更多的行为,我想这是OP想要的。@IlyaIvanov:扩展方法是静态方法。没错。但它们只能在对象的实例上调用,不能在类型名上调用。示例:无法创建允许以下代码的扩展方法:int.MyExtension()
。您只能创建一个可以这样调用的函数:inti=0;i、 MyExtension()代码>我不能添加扩展方法(因为它们是静态方法)。
为什么?您能否给出一些代码示例,说明为什么无法添加扩展方法?对于AreElementsEqual,您是否检查了不符合您需要的扩展方法?@IlyaIvanov:您无法添加可以对类名而不是实例调用的扩展方法。我不知道你需要什么样的代码样本,或者它应该显示什么。@DanielHilgarth你是说非静态方法?扩展方法是静态方法,可以用来扩展\添加更多的行为,我想这是OP想要的。@IlyaIvanov:扩展方法是静态方法。没错。但它们只能在对象的实例上调用,不能在类型名上调用。示例:无法创建允许以下代码的扩展方法:int.MyExtension()
。您只能创建一个可以这样调用的函数:inti=0;i、 MyExtension()代码>。