2017-05-22 3 views
0

J'ai 2 ObservableCollections, disons de type class1 et class2. Maintenant, dans la méthode ci-dessous, je veux itérer sur cette collection et accéder aux membres de l'objet.Passer ObservableCollection générique à une méthode et itérer dessus

public void MyMethod<T>(){ 
    var listOfLayers = new ObservableCollection<T>(); 

    if (typeof(T) == typeof(Class1)) 
    { 
     listOfLayers = (T) cOne;  
    } 
    else{ 
     listOfLayers = (T) cTwo; 
    } 

    foreach (var entry in listOfLayers){ 
     WL entry.someprop; 
    } 

} 

Mais il me lance erreur à chaque fois sur la conversion de type.

Error CS0030 Cannot convert type 'System.Collections.ObjectModel.ObservableCollection' to 'T'

S'il vous plaît noter que je ne l'ai pas créé deux méthodes basées sur le type parce que les deux méthodes vont essentiellement faire la même chose dans les tables de base de données séparés. Et donc ils vont tous les deux contenir le code en double.

Répondre

0

Vous devriez probablement convertir en ObservableCollection<T> et pas simplement T. Vous avez corrigé le code:

public void MyMethod<T>(){ 
    var listOfLayers = new ObservableCollection<T>(); 

    if (typeof(T) == typeof(Class1)) 
    { 
     listOfLayers = (ObservableCollection<T>) cOne;  
    } 
    else{ 
     listOfLayers = (ObservableCollection<T>) cTwo; 
    } 

    foreach (var entry in listOfLayers){ 
     WL entry.someprop; 
    } 
} 

En tant que nœud secondaire, votre code semble un peu étrange. Cela pourrait aussi être parce que vous avez simplifié l'exemple pour prouver votre point, mais encore: cOne sera déjà du type correct, alors pourquoi le lancez-vous?

Si vous souhaitez utiliser les méthodes de type T il serait probablement préférable de créer une méthode propre pour chaque ObservableCollection<T> que vous voulez prendre en charge, donc vous n'avez pas besoin de passer un type pour l'exécuter. Je suppose que vous souhaitez également exécuter une logique différente pour différents T afin de séparer ce serait logique.

+0

Merci Florian pour votre excellente réponse. J'ai fait les changements suggérés mais il jette toujours la même erreur: "'System.Collections.ObjectModel.ObservableCollection ' à 'System.Collections.ObjectModel.ObservableCollection ' \t". Je pense que je ferais mieux de créer deux méthodes distinctes maintenant, mais ils contiendront plus ou moins le même code. –

+0

Êtes-vous sûr que cette exception ne se produit pas dans la branche else? Donc pourrait-il être que 'typeof (T)! = Typeof (Ajuster IT.Landbase)'? –

+0

Sachez que vous ne pouvez pas convertir en types de base (donc si 'T' est une classe parente de' AdjustIT.Landbase', la distribution échouera), voir cette réponse pourquoi pas: https://stackoverflow.com/a/43378505/2259391 –

1

Vous essayez d'en convertir un qui est de type T (T) cOne; à quelque chose qui est de type ObservableCollection<T> c'est pourquoi vous obtenez l'erreur. Cela signifie que cOne doit être converti en ObservableCollection<T>

0

La façon dont vous effectuez la distribution n'est pas correcte. Il devrait lire listOfLayers = (ObservableCollection<T>) cOne, puisque listOfLayers est un ObservableCollection<T>, plutôt que T.


On ne sait pas pourquoi vous me besoin le casting bien. Vous pouvez simplement passer cOne et cTwo comme arguments à la méthode, et se débrouiller avec beaucoup de code plus propre. Je parie Class1 et Class2 sont en quelque sorte liés, de sorte qu'ils peuvent partager une classe de base ou une interface commune, et vous pouvez faire l'argument ObservableCollection<IBaseClass>.

+0

Class1 et Class2 sont des classes modèles. Ils représentent les tables de base de données. La méthode dans laquelle j'ai essayé de transtyper fait fondamentalement peu de requêtes de base de données et initialise le ObservableCollection . –