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

Man*_*iAT 5 c# generics

嗨我有这样的方法:

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

此外,我有一个XObservableCollection类,它派生自ObservableCollection.当我打电话时,它的工作原理是:

Categories = LoadR<ObservableCollection<Category>,Category>();
Products = LoadR<XObservableCollection<Product>,Product>();
Run Code Online (Sandbox Code Playgroud)

我想要做的就是这样做一个调用(避免将K作为额外参数传递):

Categories = LoadR<ObservableCollection<Category>>();
Products = LoadR<XObservableCollection<Product>>();
Run Code Online (Sandbox Code Playgroud)

我知道我可以为它写一个扩展名.但我很好奇是否有办法在没有它的情况下实现这一目标.

曼弗雷德

Mel*_*igy 1

我认为你不能。

C# 具有一种机制,可以在使用方法参数时理解来自方法参数的泛型参数,但不能理解同一方法的其他泛型参数。这不起作用。

也许您可以将签名更改为:

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

用法是:

    static void TestLoad()
    {
        var result1 = LoadR(new ObservableCollection<Something>());
        var result2 = LoadR(new DerivedClassFromObservableCollection<Something>());
    }
Run Code Online (Sandbox Code Playgroud)

我同意这不是那么好,而且我可以看出这不是您想要的。

但只是因为 C#不允许您尝试从泛型参数推断类型。

……

另一种方法是让它使用特定的集合。我看得出你更不想这样了。

因此,您可以做的一件事就是让它返回 IEnumerable,然后您的用法将类似于:

    static void TestLoad()
    {
        var result1 = new ObservableCollection( LoadR<Something>() );
        var result1 = new DerivedClassFromObservableCollection( LoadR<Something>() );
    }
Run Code Online (Sandbox Code Playgroud)

如果您想对收藏本身做一些花哨的事情,这也可能不好,因为您不再拥有它。

....

我自己会选择第一个选择。