簡體   English   中英

返回不同泛型集合的泛型方法

[英]Generic Method returning different generic collections

嗨我有這樣的方法:

        public T LoadR<T, K>()
        where T : ObservableCollection<K>, new()
        where K : IStoreElement, new() {
        T onC = new T();
        //....
        return (onC);
    }

此外,我有一個XObservableCollection類,它派生自ObservableCollection。 當我打電話時,它的工作原理是:

Categories = LoadR<ObservableCollection<Category>,Category>();
Products = LoadR<XObservableCollection<Product>,Product>();

我想要做的就是這樣做一個調用(避免將K作為額外參數傳遞):

Categories = LoadR<ObservableCollection<Category>>();
Products = LoadR<XObservableCollection<Product>>();

我知道我可以為它寫一個擴展名。 但我很好奇是否有辦法在沒有它的情況下實現這一目標。

曼弗雷德

我認為你不能。

C#有一種機制來理解方法參數中使用的泛型agruments,而不是來自同一方法的其他泛型參數。 它不起作用。

也許您可以將簽名更改為:

    private static ObservableCollection<K> LoadR<K>(.ObservableCollection<K> onC)
        where K : IStoreElement, new()
    {
        //....
        return onC;
    }

用法是:

    static void TestLoad()
    {
        var result1 = LoadR(new ObservableCollection<Something>());
        var result2 = LoadR(new DerivedClassFromObservableCollection<Something>());
    }

我同意的不是那么好,我可以認為它不是你想要的。

但只是因為C# 不會讓你嘗試從泛型參數中推斷出類型。

.....

另一種方式是使它使用特定的集合。 我可以看到你不想要這個。

所以,你可以做的一件事是讓它返回IEnumerable,然后你的用法將是這樣的:

    static void TestLoad()
    {
        var result1 = new ObservableCollection( LoadR<Something>() );
        var result1 = new DerivedClassFromObservableCollection( LoadR<Something>() );
    }

如果你想用收藏本身做一些奇特的東西,那也許不好,因為你不再擁有它。

....

我自己會選擇第一個選項。

暫無
暫無

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

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