2011-06-18 10 views
5

Cześć Mam metodę tak:metoda rodzajowa powracający różne kolekcje generyczne

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

Dalsze Mam klasy XObservableCollection który derivies z ObservableCollection. To działa jak to jest, kiedy zadzwonić:

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

Co chcę zrobić, to wykonać połączenie tak (uniknąć przekazując K jako dodatkowy parametr):

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

wiem, że może napisać dla niego rozszerzenie. Ale ciekawi mnie, czy istnieje sposób na osiągnięcie tego bez niego.

Manfred

Odpowiedz

1

Nie sądzę, że można.

C# ma mechanizm do zrozumienia ogólnych agrumentów z parametrów parametrów, gdy jest używany, ale nie z innych ogólnych argumentów tej samej metody. To nie działa.

Może zmienić swój podpis:

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

Wykorzystanie byłoby:

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

Które Zgadzam nie jest dobre, i mogę se to nie jest to, czego szukasz.

Ale tylko dlatego, że C# nie będzie pozwala ci spróbować wywnioskować typy z ogólnych argumentów.

.....

Innym sposobem aroudn jest, aby użyć określonej kolekcji. Widzę, że nie chcesz tego jeszcze bardziej.

Tak, jedno można zrobić, to zrobić to wrócić IEnumerable zamiast, to wykorzystanie będzie coś takiego:

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

które nie mogą być również dobry, jeśli chcesz robić wymyślne rzeczy samej kolekcji , ponieważ nie jesteś już jej właścicielem.

....

Sam wybrałbym pierwszą opcję.