开发者

c# Attribute Question

开发者 https://www.devze.com 2022-12-25 12:25 出处:网络
Well i need some help here i don\'t know how to solve this problem. the function of the attribute is to determine if the function can be run...

Well i need some help here i don't know how to solve this problem.

the function of the attribute is to determine if the function can be run...

So what i need is the following:

  1. The consumer of the attribute should be able to determine if it can be executed.
  2. The owner of the attribute should be able to tell the consumer that now it can/can't be executed (like a event).
  3. It must have a simple syntax.

This is what i have so far but it only implements point 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.canEx开发者_Go百科ecute = canExecute;
    }
}


Attributes are not intended for this type of purpose. You decorate a Type with an attribute, not a specific instance.

If you need a way to specify, to a consumer, that a specific method is ready to execute, or cannot execute, I would rethink your design. Instead of using an attribute, perhaps making a custom class would work much more appropriately.

Given your design, I would recommend taking a look at the ICommand interface. This basically does exactly what you are trying to do. It encapsulates a delegate into a class, with a "CanExecute" method, and an event for notifying "consumers" that the execution availability has changed. This would be a more appropriate option.


I'm afraid attributes won't be suitable for this. I'd rather go for an interface. Something like this:

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

Then instead of a method you would have a parameter such as this. That is, instead of your approach:

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

You'd write:

public class MyClass
{
    public ICheckedMethod<object, bool> MyMethod { get; private set; }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消