我想这样做:
[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; }
}
我想做一个包含名称,控件类型和选择器的属性,以便从控件中获取属性的值。
我尝试做,但不能。
答案 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")]