Прежде всего, даже если вы не see
if
или switch
, то все равно будет один где-то спрятана внутри некоторые функции. Отличительные типы во время выполнения, которые неизвестны во время компиляции, просто не будут возможны без такого рода ветвления потока управления.
Вы можете использовать один из классов коллекции для построения карты во время выполнения, которая отображает Type
экземпляров в Func<T, TResult>
methods. Например, вы можете использовать Dictionary
типа, чтобы создать такую карту:
var rendererFuncs = new Dictionary<Type, Func<object, string>>();
Затем можно добавить несколько записей в этом словаре, как это:
rendererFuncs[typeof(TextBox)] = ctype => "its text box";
rendererFuncs[typeof(DropDown)] = ctype => "its drop down";
Позже, вы можете вызвать соответствующую функцию как это:
string renderedValue = rendererFuncs[Ctype.GetType()](Ctype);
Или, если вы хотите быть на безопасной стороне (в случае, если есть Ctype
значения, которые не имеют соответствующего разрешения):
string renderedValue;
Func<object, string> renderer;
if (rendererFuncs.TryGetValue(Ctype.GetType(), out renderer)) {
renderedValue = renderer(Ctype);
} else {
renderedValue = "(no renderer found)";
}
Обратите внимание, что это будет работать только до тех пор, пока Ctype
имеет точного типа, используемого в качестве ключа в словаре; если вы хотите, чтобы все подтипы также были правильно распознаны, отбросьте словарь и создайте свою собственную карту, которая пересекает иерархию наследования для поиска типа (используя Type.BaseType
property).
Известно ли во время компиляции, какой тип передается методу 'render', или только во время выполнения? –
во время выполнения я бы назвал рендер, но я не знаю тип ctype @ O.R.Mapper –