2010-04-05 97 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; } 
}