c # Атрибут Вопрос - PullRequest
       4

c # Атрибут Вопрос

1 голос
/ 05 апреля 2010

Ну, мне нужна помощь, я не знаю, как решить эту проблему.

функция атрибута состоит в том, чтобы определить, можно ли запустить функцию ...

Так что мне нужно следующее:

  1. Потребитель атрибута должен быть в состоянии определить, если это может быть казнены.
  2. Владелец атрибута должен быть в состоянии сказать потребителю, что теперь это может / не может быть выполнен (как событие).
  3. Должен иметь простой синтаксис.

Это то, что я имею до сих пор, но оно реализует только пункт 1, 3.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ExecuteMethodAttribute : Attribute
{
    private Func<object, bool> canExecute;
    public Func<object, bool> CanExecute
    {
        get
        {
            return canExecute;
        }
    }


    public ExecuteMethodAttribute()
    {

    }

    public ExecuteMethodAttribute(Func<object, bool> canExecute)
    {
        this.canExecute = canExecute;
    }
}

Ответы [ 2 ]

5 голосов
/ 05 апреля 2010

Атрибуты не предназначены для этого типа целей. Вы украшаете Тип атрибутом, а не конкретным экземпляром.

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

Учитывая ваш дизайн, я бы рекомендовал взглянуть на интерфейс ICommand . Это в основном делает именно то, что вы пытаетесь сделать. Он инкапсулирует делегата в класс с помощью метода «CanExecute» и события для уведомления «потребителей» об изменении доступности выполнения. Это было бы более подходящим вариантом.

0 голосов
/ 05 апреля 2010

Боюсь, атрибуты не подойдут для этого. Я предпочел бы пойти на интерфейс. Примерно так:

public interface ICheckedMethod<TReturn, TParam>
{
    TReturn Execute(TParam param);
    bool CanExecute { get; }
    event EventHandler CanExecuteChanged;
}

Тогда вместо метода у вас будет такой параметр, как этот. То есть вместо вашего подхода:

public class MyClass
{
    [ExecuteMethodAttribute(some impossible parameters)]
    public object MyMethod(bool param);
}

Вы бы написали:

public class MyClass
{
    public ICheckedMethod<object, bool> MyMethod { get; private set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...