2011-06-18 79 views
5

您好我有一个这样的方法:泛型方法返回不同的泛型集合

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

而且我有一个类XObservableCollection从的ObservableCollection derivies。 它的工作原理是,当我打电话:

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

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

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

我知道我可以为它写一个扩展名。 但我很好奇,如果有一种方法来实现这个没有它。

曼弗雷德

回答

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

.....

aroudn的另一种方法是使它使用特定的集合。我可以看到你不想要这个更多。

所以,有一件事你能做的就是让它返回IEnumerable的替代,那么你的使用将是这样的:

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

,如果你想要做花哨的东西与集合本身可能不是也不错,因为你不再拥有它。

....

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