2014-01-06 1 views
0


я занимаюсь разработкой окна приложения и в том, что я создал класс для общего вида и настройки чувствительности

CommonAppearance класс Код:Как создать объект Run-time, используя Reflection в C#?

static void SetCommonAppearance(Label ctrl){ //some appearance setting code} 
static void SetCommonAppearance(GridGroupingControl ctrl){ //some appearance setting code} 
static void SetCommonAppearance(GradientPanel ctrl){ //some appearance setting code} 
static void SetCommonAppearance(Form ctrl){ //some appearance setting code} 
static void SetCommonAppearance(ComboBox ctrl){ //some appearance setting code} 
static void SetCommonAppearance(CheckBox ctrl){ //some appearance setting code} 
static void SetCommonAppearance(RadioButton ctrl){ //some appearance setting code} 
static void SetCommonAppearance(Button ctrl){ //some appearance setting code} 

public static void UseCommonTheme(Form form) 
{ 
    List<Control> lstControls = GetAllControls(form.Controls); 
    foreach (Control ctr in lstControls) 
    { 
     string temp2 = ctr.GetType().Name; 
     switch (temp2) 
     { 
      case "TextBox": 
       SetCommonAppearance((TextBox)ctr); 
       break; 
      case "AutoLabel": 
       SetCommonAppearance((Label)ctr); 
       break; 
      case "GridGroupingControl": 
       SetCommonAppearance((GridGroupingControl)ctr); 
       break; 
      case "ButtonAdv": 
       ApplyCustomTheme((ButtonAdv)ctr); 
       break; 
      case "CheckBoxAdv": 
       SetCommonAppearance((CheckBox)ctr); 
       break; 
      case "ComboBoxAdv": 
       SetCommonAppearance((ComboBox)ctr); 
       break; 
      case "RadioButtonAdv": 
       SetCommonAppearance((RadioButton)ctr); 
       break; 
     } 

    } 
} 

это приемлемо, если есть меньше приложений управления, чтобы установить общий внешний вид, но в моя заявка есть количество различных типов элементов управления.
В способе UseCommonTheme(Form form) вместо использования корпуса переключателя. Можно ли использовать отражение для управления элементами управления? Somthing как

foreach (Control ctr in lstControls) 
{ 
    string controlType = ctr.GetType().Name; 
    SetCommonAppearance((class reference of 'controlType')ctr); 
} 


Спасибо заранее.

ответ

3

Если вы используете .NET-вы можете воспользоваться DLR (динамических языковой среды):

foreach (dynamic ctr in lstControls) 
{ 
    SetCommonAppearance(ctr); 
} 

ДЛРОВ рассосутся правильная перегрузка для вас.

Если вы хотите использовать отражение:

var type = typeof(CommonAppearance); 
var methods = type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); 
foreach (Control ctr in lstControls) 
{ 
    var setAppearanceMethod = 
     methods.FirstOrDefault(m => m.GetParameters()[0].ParameterType == ctr.GetType()); 
    if(setAppearanceMethod!=null) 
     setAppearanceMethod.Invoke(null, new[] { ctr }); 
} 
+0

Я использую .net 3.5 – BhushanK

+0

@Bhushan Я добавил реализацию, которая использует отражение – Alberto

+0

@Algerto что «элемент» в 'setAppearanceMethod.Invoke (нуль, новое [] {item}); '? – BhushanK

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