2012-01-07 80 views
1

我想這樣做:屬性和功能的構造

[AttributeUsage(AttributeTargets.Property, 
       Inherited = false, 
       AllowMultiple = true)] 
sealed class MyAttribute : Attribute 
{ 
    readonly string showName; 
    readonly Type controlType; 

    public Type ControlType 
    { 
     get { return controlType; } 
    } 

    readonly Func<Control, object> selector; 

    public Func<Control, object> Selector 
    { 
     get { return selector; } 
    } 


    public MyAttribute(string showName, 
         Type controlType, 
         Func<Control, object> selector) 
    { 
     this.showName = showName; 
     this.controlType = controlType; 
     this.selector = selector; 
    } 

    public string ShowName 
    { 
     get { return showName; } 
    } 

} 
class Foo 
{ 
    // problem. Do you have an idea? 
    [My("id number", 
    typeof(NumericUpDown), 
    Convert.ToInt32(control=>((NumericUpDown)control).Value))] 
    public int Id { get; set; } 
} 

我想爲起飛做屬性包含名稱,類型控制,並選擇從控制屬性的值。

我嘗試做,不能。

+2

你重新發明的PropertyGrid。不利用它的所有管道(TypeConverter,UITypeEditor)將是一個錯誤。要做的最好的事情就是提前思考,並問問自己如何爲這些屬性創建功能編輯器。控制位置和大小等細節非常重要。 – 2012-01-07 22:34:45

回答

2

不,您不能在屬性裝飾中使用匿名方法或lambda表達式。

順便說一句,如果你能,這將是(移動control聲明):

control=>Convert.ToInt32(((NumericUpDown)control).Value) 

但是...你不能。可以使用通過反射解析的方法的字符串名稱,也可以使用類似於具有虛擬方法覆蓋的屬性類的子類。

+0

如何用反射來解決? – zardav 2012-01-07 21:15:38

+0

@zardav with someType.GetMethod(string) – 2012-01-07 21:17:26

1

您不能在屬性聲明中使用lambda表達式。我也有這個問題,並通過使用一個字符串作爲lambdas的關鍵字來解決它。在屬性我然後只聲明給予拉姆達的關鍵。

Dictionary<string, Func<Control, object>> funcDict = new Dictionary<string, Func<Control, object>>(); 
funcDict.Add("return text", c => c.Text); 

屬性這樣使用:

[MyAttribute("show", typeof(TextBox), "return text")]