2011-06-18 10 views
5

Hola tengo un método como este:método genérico que regresan diferentes colecciones genéricas

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

Además tengo una clase que XObservableCollection derivies de ObservableCollection. Funciona como lo es cuando llamo:

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

Lo que quiero hacer es hacer una llamada como ésta (evitar pasar el K como parámetro adicional):

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

sé que podría escribir una extensión para ello. Pero tengo curiosidad si hay una manera de lograr esto sin eso.

Manfred

Respuesta

1

No creo que se pueda.

C# tiene un mecanismo para comprender agrupamientos genéricos de los parámetros del método cuando se usan en él, pero no de otros argumentos genéricos del mismo método. No funciona

Tal vez usted puede cambiar su firma a:

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

uso sería:

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

que estoy de acuerdo no es tan bueno, y puede en sí no es lo que están buscando.

Pero solo porque C# no lo haría le permite intentar inferir los tipos de los argumentos genéricos.

.....

La otra forma es aroudn a hacer que use una colección específica. Veo que no quieres esto aún más.

Por lo tanto, una cosa que puede hacer es asegurarse de que vuelva IEnumerable lugar, entonces el uso va a ser algo como:

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

Lo que no puede ser bueno también si quieres hacer cosas de lujo con la propia colección , porque ya no lo tienes.

....

me inclinaría por la primera opción de mí mismo.

Cuestiones relacionadas