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

时间:2011-06-18 12:25:17

标签: c# generics

嗨我有这样的方法:

        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 个答案:

答案 0 :(得分:1)

我认为你不能。

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#不会让你尝试从泛型参数中推断出类型。

.....

aroudn的另一种方式是使其使用特定的集合。我可以看到你甚至不想要这个。

所以,你可以做的一件事是让它返回IEnumerable,然后你的用法将是这样的:

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

如果你想用收藏本身做一些奇特的东西,那可能也不好,因为你不再拥有它。

...

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