2014-01-06 1 views
0


은 내가 Windows 응용 프로그램을 개발하고 그 나는 일반적인 모습에 대 한 클래스를 생성

CommonAppearance 클래스 코드 설정 느낌 : 일반적인 외관 만에 설정 적은 제어 응용 프로그램이있는 경우개체를 캐스팅하는 방법 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) 메서드에서 반사을 사용하여 컨트롤을 캐스팅 할 수 있습니까? 뭔가를해야만 미리 감사드립니다

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



있다. 당신이 .NET 4를 사용하는 경우

답변

3

당신은 DLR (동적 언어 런타임)을 활용할 수 있습니다

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

DLR에 당신을 위해 올바른 과부하가 해결됩니다.

당신은 반사 사용하려면 :

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

내가 널 (null) ("항목이"setAppearanceMethod.Invoke'에 무엇 @Algerto 반사 – BhushanK

+0

을 사용하고, 새를 [] {item});'? – Alberto

+0

를 사용하는 구현을 추가 @Bhushan 내가 .NET 3.5 – BhushanK

관련 문제