2014-01-06 72 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