2010-04-05 70 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 2010-04-05 16:03:22

回答

5

属性不用于这类用途的。你用一个属性装饰类型,而不是一个特定的实例。

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

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

+0

嗯,我在玩“MVVM”,以及我用ICommand第一次,但后来我看到Blend 4使用行为inseads命令但后来我失去了功能,指定它是否可以执行或不,因此我的想法是写一个行为,会给我这个功能... – Peter 2010-04-05 15:52:40

+0

@Petoj:混合4使用行为,但它也使用命令。 WPF和Silverlight都(现在)完全支持ICommand,并且这可以在Blend中使用。然而,它并不像它那么好 - 我有一个自定义行为,让我绑定到ViewModel上的ICommand,这很好,因为你可以使用ExecuteCommandAction从Blend中触发它... – 2010-04-05 16:01:58

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