簡體   English   中英

不受參數限制的通用委托的返回類型

[英]Restrict Return Type of Generic Delegate Irrespective of Parameters

我試圖在不指定參數簽名的情況下限制泛型委托的返回類型,並且我不知道如何執行此操作,甚至可能。

我該怎么做還是不可能?

我的研究干了。 一些偽C#代碼可能會幫助您引導我要嘗試做的事情:

public class SomeClass< T, U > where T : Delegate // returning U
{
    private someDelegate;

    public SomeClass( T someDelegate )
    {
        this.someDelegate = someDelegate;
    }

    public U Run()
    {
        return someDelegate.DynamicInvoke();
    }
}

...其他地方

public delegate string aDelegate();

public static string SayHi()
{
    return "Hello!";
}

aDelegate greeter = SayHi;

var something = new SomeClass< aDelegate, string>( greeter );

Console.WriteLine( something.Run() ); // Should write "Hello" to the console.

我知道這是一個人為的偽示例。 當然,我的目標是更廣泛地使用。 我正在嘗試編寫一個控制台菜單類,該類將給定菜單選項的列表與將根據用戶選擇的選項觸發的動作相關聯。 現在,它僅返回用戶從菜單中選擇的字符串。 我想做的就是返回相關聯的方法返回的內容(如果有的話)。 這也許可以一個元組用戶選擇的選項字符串返回......但是,我想這個小例子只是直接切到技術障礙,我經歷。

謝謝!

.NET已經定義了一個通用委托,該委托返回作為結果的通用參數Func<T> 您甚至不需要定義它。

public class SomeClass<U>
{
    private Func<U>;

    public SomeClass(Func<U> someDelegate)
    {
        this.someDelegate = someDelegate;
    }

    public U Run()
    {
        return someDelegate();
    }
}

沒有真正有用的理由允許該類型的用戶提供具有相同簽名的任意委托。 確實,我建議您盡可能避免在代碼中使用FuncAction (具有各種不同數量的通用參數)以外的任何委托,因為這樣做會很麻煩。 對於任何具有不同類型的委托但具有相同簽名的調用者,無論如何將其簡單地轉換為Func<T> ,我都認為這是一個合理的限制,這對他們來說甚至不是一個困難的轉換。

如果您不想使用Func<T> (如Servy建議),例如,如果您有自己的自定義委托要通過類型安全傳遞,那么也許可以使您的自定義委托具有通用性為其返回類型。 然后,您可以通過以下方式進行操作:

public delegate T MyDelegate<T>();

public class Foo<T>
{
    private readonly MyDelegate<T> _delegate;

    public Foo(MyDelegate<T> handler)
    {
        _delegate = handler;
    }

    public T Bar()
    {
        return _delegate();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM