通用方法返回不同的通用集合

5

你好,我有一个这样的方法:

        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>>();

我知道我可以为此编写一个扩展程序。 但我想知道是否有一种不需要扩展程序就能实现这个目标的方法。

曼弗雷德

1个回答

1

我认为你是做不到的。

C# 有一种从方法参数中理解泛型参数的机制,但不能从同一方法的其他泛型参数中理解。这行不通。

也许你可以改变你的签名:

    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>() );
    }

如果您想对集合本身进行高级操作,这也可能不是很好,因为您不再拥有它。

....

我个人会选择第一个选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接