使用静态方法处理泛型
本文关键字:泛型 处理 静态方法 | 更新日期: 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);
}
}