2015-11-20 2 views
0

Я реализую пользовательский класс Assert, аналогичный NUnit's Assert.Обходное решение для дженериков со статическими методами

У нас есть Sonar включен с правилами StyleCop, и он жалуется, что я всегда должен использовать дженерики вместо 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

Можете ли вы проиллюстрировать код? Рассматривали ли вы методы расширения? –

+6

Класс не обязательно должен быть общим. Вместо этого создайте метод generic. – MarcinJuraszek

ответ

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

Почему я не взял голубую таблетку? –

Смежные вопросы