Dans la solution que j'ai élaborée à cette question =>General type conversion without risking Exceptions (Voir la modification au bas de la question), je dois mettre en cache une méthode de conversion entre deux types. Donc, étant donné Type1 et Type2 j'ai besoin de récupérer une méthode.Collection avec deux clés
Dans la réponse à cette question =>What is the best C# collection with two keys and an object?, il est recommandé d'utiliser un dictionnaire de dictionnaires. C'est similaire à ce que je fais.
Mais je ne l'aime pas. Il ne circule pas logiquement avec ce que la collection est censée représenter. Aussi pour récupérer une valeur que j'ai à faire:
if (!_Types.ContainsKey (s.GetType()))
{
type1Cache = new Dictionary<Type, ConversionCache>();
_Types.Add (s.GetType(), type1Cache);
}
else
{
type1Cache = _Types[s.GetType()];
}
if (!type1Cache.ContainsKey (value.GetType()))
{
// We havent converted this type before, so create a new conversion
type2Cache = new ConversionCache (s.GetType(), value.GetType());
// Add to the cache
type1Cache.Add (value.GetType(), type2Cache);
}
else
{
type2Cache = type1Cache[value.GetType()];
}
qui est un peu long vent.
Je veux juste faire quelque chose comme
if (!_Types.ContainsKey (s.GetType(), value.GetType()))
{
cache = new ConversionCache (s.GetType(), value.GetType());
_Types.Add (s.GetType(), value.GetType(), cache);
}
else
{
cache = _Types[s.GetType(), value.GetType()];
}
Une solution serait de concaténer les valeurs de chaîne des types. Quelque chose comme:
if (!_Types.ContainsKey (s.GetType().ToString() + ":" + value.GetType().ToString()))
{
cache = new ConversionCache (s.GetType(), value.GetType());
_Types.Add (s.GetType().ToString() + ":" + value.GetType().ToString(), cache);
}
else
{
cache = _Types[s.GetType().ToString() + ":" + value.GetType().ToString()];
}
Je sais que cela fonctionnerait dans ce cas parce qu'il ya un à un entre un type et sa représentation de chaîne.
Mais cela sent très mauvais, et ne fonctionnerait pas dans d'autres situations.
Y a-t-il une meilleure façon de procéder?