构造函数中的属性和函数

时间:2012-01-07 20:25:29

标签: c# .net winforms attributes lambda

我想这样做:

[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 个答案:

答案 0 :(得分:2)

不,您不能在属性修饰中使用匿名方法或lambda表达式。

顺便说一句,如果可以的话,那就是(移动control声明):

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

但是......你做不到。使用您使用反射解析的方法的字符串名称,或者使用类似属性类的子类而使用虚方法覆盖。

答案 1 :(得分:1)

您不能在属性声明中使用lambda表达式。我也有这个问题,并通过使用字符串作为lambda的键来解决它。在属性I中,然后只声明给lambda的键。

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")]