Я думаю, что FXCop не нравится код, потому что хорошим объектно-ориентированным решением было бы добавить виртуальный метод ResetControl
к классу Control
(что вы, конечно, не можете сделать).
Если вам нужно четкое объектно-ориентированное решение, вы можете создать интерфейс IResetableControl
и создать производный класс для каждого элемента управления, который будет реализовывать интерфейс.
Если вы просто хотите сделать существующий код синтаксически более приятным, вы можете использовать следующий вспомогательный метод:
public void IfCast<T>(object obj, Action<T> f) {
if (obj is T) f((T)obj);
}
Тогда вы могли бы просто написать:
IfCast(controlOnPage, (TextBox t) =>
ResetTextBoxControl(t));
IfCast(controlOnPage, (MediaPicker mp) => {
mp.Media = null; });
Это имеет ту же семантику, что и ваш исходный код, но это немного приятнее (и я думаю, что FxCop примет это). Обратите внимание, что параметр универсального типа выводится из типа, указанного в лямбда-выражении, например, (TextBox t)
. Это также избавляет от необходимости выполнять дополнительное приведение в коде, который обрабатывает регистр, потому что вы уже получаете значение правильного типа (например, mp
).