使用静态方法进行泛型的解决方法

时间:2015-11-20 01:19:53

标签: c# generics

我正在实现类似于NUnit's 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);
}

我怎样才能最好地重构这个课程以符合这两个规则?

1 个答案:

答案 0 :(得分:4)

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

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);
    }
}