2011-01-28 112 views
2

的我得做一些一串代碼像鑄造OBJECTTYPE

if control == typeof(GridCurrencyTextBox)) 
{ 
    ((GridCurrencyTextBox)(_control)).Text = .... 
} 
if control == typeof(TextBox)) 
{ 
    ((TextBox)(_control)).Text = .... 
} 

等。 我知道我可以通過control.GetType()來估計類型,但是.Text屬性只能在編譯時知道類型。

我想是這樣的:

Type t = _control.getType(); 
    (t(_control)).Text = ..... 

有什麼建議?謝謝!

回答

3

很難從你的問題你實際上問說,但你嘗試過:

ITextControl textControl = _control as ITextControl; 
if(textControl != null) 
{ 
    textControl.Text = //... 
} 

as鑄造會給你(在這種情況下null)的默認值,如果對象你」重新嘗試投射不是正確的類型,據我所知,.NET中的大多數(所有?)文本控件都來自ITextControl(它只定義了Text屬性)。

這裏假設你使用的是ASP.NET。正如其他人所提到的,在Windows Forms Control中有一個Text屬性,因此您只需確保將其轉換爲Control,並且如果它已經是控件,則該檢查是不必要的(除非要確保該值不爲空)。

如果您使用任何其他類型的控件,並且它不是從一種可爲您提供Text屬性的常見類型派生出來的,那麼您可能不得不訴諸於使用反射,但這遠非理想,因爲它會是慢:

PropertyInfo text = _control.GetType().GetProperty("Text", BindingFlags.Public | BindingFlags.Instance, null, typeof(string), Type.EmptyTypes, null); 
if(text != null) 
{ 
    text.SetValue(obj, /* some value */, null); 
} 
+0

是不是ITextControl只在ASP可用(因爲它在System.Web.UI程序定義的接口命名空間)? – 2011-01-28 10:10:37

0

如果您使用的是.NET 3.0,你可以利用的擴展方法來重寫你的代碼也看起來更好一點。您的每一個對比組成的幾個小步驟:​​

  1. 檢查特定類型的
  2. 如果對象是特定類型的,施放它,它
  3. 執行一些動作

步驟1和2可以使用as運營商執行(因爲您的目標必須是對象,因爲as運算符只能投射引用類型)。第3步可以通過委託完成。因此,一個輔助函數看起來是這樣的:

public static class Helper 
{ 
    public static void Do<T>(object obj, Action<T> action) 
     where T : class 
    { 
     T castedObject = obj as T; 
     if (castedObject != null && action != null) 
      action(castedObject); 
    } 
} 

然後,你可以撥打:

Helper.Do<TextBox>(control, delegate(TextBox obj) { obj.Text = "your text goes here"; }); 

...你必須處理每種類型。此解決方案使用助手類和匿名委託。

這不是最好的解決方案。隨着擴展方法和lambda表達式,你可以有這樣的:

public static class ObjectExtensions 
{ 
    public static void Do<T>(this T obj, Action<T> action) 
    { 
     if (obj != null && action != null) 
      action(obj); 
    } 

    public static T Cast<T>(this object obj) 
     where T : class 
    { 
     return obj as T; 
    } 
} 

...及用途:

control.Cast<TextBox>().Do(t => t.Text = "your text goes here"); 

你必須處理每種類型。這條線比以前的解決方案更具可讀性。但在這種情況下,你必須知道擴展方法和lambda表達式是如何工作的。

0

如果你有財產,你不知道類型,你總是可以做到這一點:

var type = _control.GetType(); 
var propertyInfo = type.GetProperty("Text"); 
if(propertyInfo!=null) propertyInfo.SetValue(_control,"Some Value");