2013-12-15 4 views
-1

я просто следующий сценарий я хочу, чтобы вернуть строку из метода, но метод должен быть основан на типе переменной, которая является (Type CType)метод, основанный на переменной типа

мне нужно сделать рендер класс, как это

public string render(TextBox ctype){ 
return "its text box"; 
} 
public string render(DropDown ctype){ 
return "its drop down"; 
} 

вы знаете TextBox является тип вот почему я могу объявить переменную типа, как этот

var CType = typeof(TextBox) 

и мне нужно вызвать т он визуализации метод как этот

render(Ctype); 

так, если CTYPE является тип TextBox он должен вызвать рендер (TextBox CType) и так далее Как я могу это сделать?

+0

Известно ли во время компиляции, какой тип передается методу 'render', или только во время выполнения? –

+0

во время выполнения я бы назвал рендер, но я не знаю тип ctype @ O.R.Mapper –

ответ

0

вы должны использовать шаблон функции

public customRender<T>(T ctype) 
{ 
    if(ctype is TextBox){ 
     //render textbox 
    } 
    else if(ctype is DropDown){ 
     //render dropdown 
    } 
} 

надеюсь, что это поможет

+0

В этом случае, какой хороший общий параметр? Почему бы просто не ввести 'ctype' в' Control' и отказаться от общего параметра? –

+0

проблема в том, что я не хочу использовать if или switch case –

+0

что вы имеете в виду @ O.R.Mapper? –

0

Прежде всего, даже если вы не seeif или 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).

+0

, я проверю его и скажу вам результат благодаря вашему ответу :) –

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