2010-04-05 2 views
1

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

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

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

  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; 
    } 
} 
+0

Я столкнулся с чем-то похожее на это раньше. Вы не сможете использовать этот атрибут, потому что параметры для атрибута должны быть константой, типом или массивом. – fre0n

ответ

5

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

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

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

+0

Ну, я играл с «MVVM», и я сначала использовал ICommand, но потом увидел, что Blend 4 использует Behaviors insead of Commands, но затем я потерял функциональность, чтобы указать, может ли он выполняться или нет, поэтому мой недостаток заключался в том, чтобы написать Поведение, которое даст мне эту функциональность ... – Peter

+0

@Petoj: Blend 4 использует поведение, но также использует команды. WPF и Silverlight оба (сейчас) поддерживают ICommand полностью, и это можно использовать в Blend. Однако это не так хорошо, как может быть - у меня есть пользовательское поведение, которое позволяет мне привязываться к ICommand в ViewModel, что приятно, поскольку вы можете использовать ExecuteCommandAction, чтобы вызвать его из Blend с этим ... –

0

Боюсь, что атрибуты не подходят для этого. Я бы предпочел пойти на интерфейс. Что-то вроде этого:

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; } 
} 
Смежные вопросы