Атрибут и функции в конструкторе - PullRequest
1 голос
/ 08 января 2012

Я хочу сделать это:

[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 ]

2 голосов
/ 08 января 2012

Нет, вы не можете использовать анонимный метод или лямбда-выражение в оформлении атрибута.

Кстати, если бы вы могли, это было бы (перемещение объявления control):

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

Но ... Вы не можете.Либо используйте строковое имя метода, который вы разрешаете с помощью отражения, либо используйте что-то вроде подкласса класса атрибута с переопределением виртуального метода.

1 голос
/ 08 января 2012

Вы не можете использовать лямбда-выражения в объявлениях атрибутов. У меня тоже была эта проблема и я решил использовать словарь со строкой в ​​качестве ключа для лямбд. В атрибуте я тогда только объявил ключ, данный лямбде.

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")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...