2014-01-06 119 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); 
} 


在此先感謝。

回答

3

如果您使用的是.NET 4,你可以利用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

我使用.NET 3.5 – BhushanK

+0

@Bhushan我補充說,使用反射 – Alberto

+0

@Algerto什麼'setAppearanceMethod.Invoke是「項目」(空的實現,新[] {item});'? – BhushanK