Déballer un type d'objet en une primitive et d'autres types (simulant une liaison tardive)
Question
J'ai une classe qui contient des membres de type Append pour chaque type de primitive, chaîne et INetSerializable:
public class TypeAppender
{
public void Append(int i ) {}
public void Append(double d) {}
public void Append(string s){}i){}
public void Append(INetSerializable ins){}
}
Dans une autre classe, je souhaite appeler cette méthode "de manière générique, pour ainsi dire", en transmettant Object
.dis que j'ai quelque chose comme ça:
class SomeClientClass
{
TypeAppender _appender=new TypeAppender ();
Dictionary<string, Object> _cmdTable =new Dictionary<string, Object>();
public void Process()
{
foreach(KeyValuePair<string, Object> pair in cmdTable )
{
_appender.Append(pair.Key);
Object obj = pair.Value;
if (obj is int)
_appender..Append((int)obj);
else if (obj is double)
_appender..Append((double)obj);
else if (obj is char)
_appender..Append((char)obj);
else if (obj is string)
_appender..Append((string)obj);
}
}
public void AddParam<T>(string key, T value)
{
_cmdTable.Add(key, value);
}
}
Question n ° 1: pair.Value sera-t-il décompressé vers une primitive correcte? s
Question n ° 2: Un problème avec la fonction membre AddParam?
Merci
La solution
Non.
Avec le code tel quel, la compilation échouera car il n’ya pas de conversion appropriée d’objet - > type non-objet. Vous devrez convertir manuellement le code dans le type approprié.
Une option consiste à fournir une surcharge d’ajout de type Object et à y effectuer la logique.
void Append(object obj) {
if ( obj is int ) {
Append((int)obj);
} else if ( obj is double) {
Append((double)obj);
...
}
MODIFIER la question n ° 2
Il n'y a rien de mal en ce sens que cela fonctionnera correctement. Cependant, cela ne semble pas ajouter de valeur à votre application par rapport à un non-générique qui prend un paramètre d'objet.