我正在实现类似于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);
}
我怎样才能最好地重构这个课程以符合这两个规则?
答案 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);
}
}