2017-02-14 27 views
0

我想創建一個對象,其中包含調用某個其他類中的特定方法。您應該能夠從對象的實例觸發對該方法的調用。據我設法弄清楚,這樣做的方式將是一個代表。那麼這是否是一種有效的方式來執行此操作?用你想用作委託的類包裝一個方法,然後像這樣設置你的對象?如何創建一個構造函數從另一個類接受方法的對象?

public class ItemCombination 
{ 
    public ItemCombination(string Item1, string Item2, Delegate interaction) 
    { 
     this.Item1 = Item1; 
     this.Item2 = Item2; 
     this.interaction = interaction; 
    } 

    public string Item1 { get; set; } 
    public string Item2 { get; set; } 
    public Delegate interaction { get; set; } 

    public void Interact() 
    { 
     interaction(); 
    } 
} 
+5

傳入回調絕對是注入功能的合法方式。不過,我會建議一個類型化的回調(爲了清晰起見,例如Action,Func 等)。 – Eric

回答

1

這正是代表是,然而由於已經在評論中提到的,你應該使用類型化的代表,即System.Action<T...>如果委託具有void返回類型,或者Func<T..., R>如果返回的R一個實例。您的示例將如下所示:

public class ItemCombination 
{ 
    public ItemCombination(string Item1, string Item2, Action interaction) 
    { 
     this.Item1 = Item1; 
     this.Item2 = Item2; 
     this.interaction = interaction; 
    } 

    public string Item1 { get; set; } 
    public string Item2 { get; set; } 
    public Action Interaction { get; set; } 

    public void Interact() 
    { 
     // safeguard against null delegate 
     Interaction?.Invoke(); 
    } 
} 
+0

啊,明白了。你甚至可以直接從公共字段Interaction中調用,而不是專門爲它創建方法? – PPFY

+1

當然,這完全取決於你想封裝和保護你的API的程度。例如。如果'interaction'參數爲'null',或者在包裝器中調用它'Interact()',如果委託爲'null',則可以在構造函數中設置默認實現。 –

相關問題