Можно использовать дженерики для проверки (время компиляции), если аргумент метода реализует два интерфейса:
interface IPropA
{
string PropA { get; set; }
}
interface IPropB
{
string PropB { get; set; }
}
class TestClass
{
void DoSomething<T>(T t) where T : IPropA, IPropB
{
MessageBox.Show(t.PropA);
MessageBox.Show(t.PropB);
}
}
То же с аргументом, который наследован от базового класса и интерфейса.
switch: good efficiency, least maintainable
dictionary: good efficiency, better maintainability
reflection: least efficient, best maintainability
Подсказка: игнорируйте эффективность и беспокойтесь только о ремонтопригодности, если вы на самом деле не проверили производительность и не обнаружили, что это проблема.
Я не говорю, что отражение - ваш единственный выбор, просто что это позволит вам добавлять / удалять и переименовывать свойства по мере необходимости, и вам не нужно синхронизировать оператор switch или словарь.
Поскольку вы используете строки Dictionary, вероятно, будет быстрее. Переключатель по существу будет переведен в хеш-таблицу при использовании строк. Но если вы используете int или что-то подобное, он преобразуется в таблицу переходов и будет работать быстрее.
см. этот ответ и вопрос для более подробной информации
Лучше всего профилировать его и найти наверняка
То, как вы получаете значение каждого свойства, вероятно, будет иметь меньшее влияние на общую производительность, чем то, как вы визуализируете свою сетку.
Позвольте мне привести пример: скажем, у вас есть следующая реализация:
private string _latestFieldName = string.Empty;
private PropertyInfo _propertyInfo;
object GetFieldValue(string FieldName)
{
if(FieldName != _latestFieldName)
{
_propertyInfo = typeof(yourTypeName).GetProperty(FieldName);
}
return _propertyInfo.GetValue(this,null);
}
Если рендеринг вашей сетки рендерит строку за раз с использованием отражения, он должен будет каждый раз получать информацию о свойстве. Если вы визуализируете столбец за столбцом, вам нужно будет получить свойство propertyInfo только один раз для каждого свойства, и поскольку прогноз ветвления будет правильным почти каждый раз, вы пропустите только несколько тактов в if. Когда у вас уже есть PropertyInfo и вам не нужно приводить результат вызова к GetValue. Использование отражения ОЧЕНЬ близко к использованию получателя свойства, когда дело касается скорости.
Я хочу сказать, прежде чем вы начнете оптимизировать, используйте профилировщик. (Конечно, если вы не можете хорошо изменить сетку, вы также не сможете ее оптимизировать)