Conversão do tipo de uma classe de modelo?
-
21-08-2019 - |
Pergunta
Eu tenho uma classe chamada "baseclass". A partir desta classe I herdar uma classe nomes "inheritedClass" (classe pública inheritedClass: baseclass)
O baseclass contém uma função pública que retorna um HashSet<baseClass>
. Quando chamado a partir do inheritedClass, o tipo de retorno é, obviamente, ainda HashSet<baseClass>
, mas eu preciso de um HashSet<inheritedClass>
.
A ala de conversão (HashSet<inheritedClass>
) returnValue, onde returnValue é do tipo HashSet<baseClass>
não funciona.
Existe uma maneira de converter o HashSet-Type de baseclass para inheritedClass sem converter cada elemento manualmente?
Agradecemos antecipadamente, Frank
Solução
Você realmente quer dizer C # nas tags? HashMap
é um tipo Java. Também geralmente tem dois parâmetros de tipo em vez de um ...
Em C #, classes genéricas são sempre invariável. Alguns interfaces de irá ser variante em C # 4, mas muito poucos (apenas aqueles que ou única usar o parâmetro de tipo em uma positiion de saída, por exemplo IEnumerable<T>
, ou única utilizar o parâmetro de tipo numa posição de entrada, por exemplo IComparable<T>
).
Se você puder fornecer informações mais precisas sobre a sua situação, provavelmente vamos ser capazes de ajuda chegar a uma solução simples -. Especialmente se você pode usar LINQ com seu método Cast<T>()
EDIT: Ok, com HashSet<T>
:
HashSet<BaseType> baseSet = ...;
var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>());
Note que, mesmo com C # 4 esta seria necessária porque o compilador não sabe que cada valor em baseSet
é uma instância de DerivedType
- tem de haver uma verificação em tempo de execução. O inverso (criando uma HashSet<BaseType>
de um HashSet<DerivedType>
) faria trabalho em C # 4.
editar mais: Se você só quer usar UnionWith
, que não requer um HashSet<DerivedType>
- requer uma IEnumerable<DerivedType>
. Eu sugiro que você faça:
HashSet<BaseType> baseSet = ...;
HashSet<DerivedType> derivedSet = ...;
derivedSet.UnionWith(baseSet.Cast<DerivedType>());
Outras dicas
Aqui está a solução
//**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.}
}