使用静态方法处理泛型

本文关键字:泛型 处理 静态方法 | 更新日期: 2023-09-27 18:23:36

我正在实现一个类似于NUnit的Assert的自定义Assert类。

我们用StyleCop规则打开了Sonar,它抱怨我应该总是使用泛型而不是object。如果我把我的类改为泛型类,那么我就陷入了泛型类不能有静态方法的规则中。

例如,考虑以下代码(我当前方法的一个非常简化的版本):

public class Assert
{
    public static void PropertyHasValue(object obj, string propertyName, object expectedValue)
    {
        var value = obj.GetType().GetProperty(propertyName).GetValue(obj, null);
        Assert.AreEqual(expectedValue, value);
    }
}

在Assert类中包含实例方法在我的opnion中没有任何意义。当我想使用TestCases:时,一个通用方法会迫使我做这样的事情(未经测试)

[TestCase("someProperty", 10)]
[TestCase("anotherProperty", "someString")]
public void TestMethod(string propertyName, object expectedValue)
{
    Assert.PropertyHasValue<object>(myObj, propertyName, expectedValue);
}

如何最好地重构这个类以符合这两个规则?

使用静态方法处理泛型

我会问一个不同的问题:为什么需要这样的方法?

Assert.PropertyHasValue(foo, "bar", true)Assert.AreEqual(foo.bar, true)不一样吗?

它是:

  • 清洁器
  • 没有机会在房地产名称中拼写错误
  • 获得编译时安全性

如果你真的需要这样做,你可能想使用Func<U, T>而不是string来指定你的属性:

public static class Assert
{
    public static void PropertyHasValue<T,U>(T obj, Func<T, U> propertyGetter, U expectedValue)
    {
        var value = propertyGetter(obj);
        Assert.AreEqual(expectedValue, value);
    }
}