簡體   English   中英

如何在C#中使用Reflection強制轉換對象運行時?

[英]How to cast an object Run-time using Reflection in C#?


我正在開發Windows應用程序,因此我創建了一個用於常見外觀設置的類

CommonAppearance類代碼:

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)而不是使用switch case我們可以使用反射來投射控件嗎?

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


提前致謝。

如果您使用的是.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 });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM