Déballer un type d'objet en une primitive et d'autres types (simulant une liaison tardive)

StackOverflow https://stackoverflow.com/questions/607668

  •  03-07-2019
  •  | 
  •  

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top