Я не совсем уверен, в чем вопрос, но если вы ищете какой-либо способ унифицировать код IsFoorVarXConsistent, вы можете сделать это, используя отражение или передав выражение:
public bool IsConsistent(Func<Foo, bool> property)
{
foreach (Foo tempFoo in allFoos)
{
if (property(tempFoo) != property(defaultFoo))
return false;
}
return true;
}
Вызывается так:
bool is1Consistent = IsConsistent(f => f.FooVar1);
Как показано, это будет работать только для логических свойств. Чтобы распространить его на другие типы, мы можем сделать его универсальным в типе свойства. Однако в этом случае мы не можем использовать! = Для проверки неравенства, потому что не все типы определяют оператор! =. Вместо этого мы можем использовать метод .Equals и! Оператор:
public bool IsConsistent<T>(Func<Foo, T> property)
where T : struct
{
foreach (Foo tempFoo in allFoos)
{
if (!property(tempFoo).Equals(property(defaultFoo)))
return false;
}
return true;
}
Предложение where T : struct
ограничивает это типами значений, такими как int, bool и decimal. В частности, он не будет работать со строками. Удаление ограничения where
позволяет ему работать со строками и другими ссылочными типами, но создает возможность того, что property(tempFoo)
будет иметь значение null, что вызовет исключение NullReferenceException, когда мы вызовем для него .Equals. Поэтому, если вы удалите ограничение типов значений, вам потребуется добавить обработку ошибок для этого сценария.