c#属性问题

时间:2010-04-05 15:42:20

标签: c# design-patterns oop attributes

我需要一些帮助,我不知道如何解决这个问题。

属性的功能是确定是否可以运行该功能......

所以我需要的是以下内容:

  1. 属性的使用者应该 能够确定它是否可以 执行。
  2. 属性的所有者应该是 能够告诉消费者现在它 可以/不能执行(像一个 事件)。
  3. 必须有一个简单的语法。
  4. 这是我到目前为止所做的,但它只实现了第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 个答案:

答案 0 :(得分:5)

属性不适用于此类目的。使用属性装饰类型,而不是特定实例。

如果您需要一种方法来向消费者指定特定方法已准备好执行或无法执行,我会重新考虑您的设计。而不是使用属性,也许制作自定义类会更合适。

鉴于您的设计,我建议您查看ICommand interface。这基本上完全符合您的要求。它使用“CanExecute”方法将委托封装到类中,并使用事件通知“使用者”执行可用性已更改。这将是一个更合适的选择。

答案 1 :(得分: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; }
}