Conversion du type d'une classe de modèle?
-
21-08-2019 - |
Question
J'ai une classe nommée « BaseClass ». A partir de cette classe I héritera d'un nom de classe "inheritedClass" (inheritedClass public class: BaseClass)
Le BaseClass contient une fonction publique qui renvoie un HashSet<baseClass>
. Lorsqu'il est appelé à partir du inheritedClass, le type de retour est évidemment encore HashSet<inheritedClass>
, mais je besoin d'un <=>.
A ala de conversion (<=>) returnValue, où returnValue est de type ne fonctionne pas <=>.
Est-il possible de convertir le HashSet-type de BaseClass à inheritedClass sans convertir chaque élément manuellement?
Merci d'avance, Frank
La solution
Voulez-vous dire vraiment C # dans les balises? Est un type HashMap
Java. En outre, il a généralement deux paramètres de type plutôt que d'un ...
En C #, les classes génériques sont toujours invariant. Certains interfaces être variante C # 4, mais très peu (seulement ceux qui soit uniquement utiliser le paramètre de type dans une positiion de sortie, par exemple < =>, ou uniquement utiliser le paramètre de type dans une position d'entrée, par exemple, IEnumerable<T>
).
Si vous pouvez fournir des informations plus précises sur votre situation, nous serons probablement en mesure d'aider à trouver une solution simple -. En particulier si vous pouvez utiliser LINQ avec sa méthode IComparable<T>
EDIT: D'accord, avec Cast<T>()
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
Notez que même avec C # 4 ce serait nécessaire parce que le compilateur ne sait pas que chaque valeur est une instance HashSet<T>
de baseSet
- il doit y avoir un contrôle d'exécution en temps. L'inverse (la création d'un DerivedType
d'un HashSet<BaseType>
) serait travail en C # 4.
PLUS EDIT: Si vous voulez juste utiliser HashSet<DerivedType>
, qui ne nécessite pas une UnionWith
- il faut un IEnumerable<DerivedType>
. Je vous suggère de faire:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
Autres conseils
Voici la solution
//**Your BaseClass**
public class BaseClass<T> where T : BaseClass<T>
{
public HashSet<T> GetHashSet()
{
HashSet<T> _hSet = new HashSet<T>();
//do some work
//create a HashSet<T> and return;
return _hSet;
}
}
//**Your Inherited/Derived Class**
public class InheritedClass : BaseClass<InheritedClass>
{
//you have the method inherited as you need.}
}