2009-03-03 8 views
0

J'ai une classe qui contient des membres append comme pour chaque type primitif, cordes et INetSerializable:Déballage un type d'objet à un type primitif et d'autres (simulant la liaison tardive)

public class TypeAppender 
    { 
     public void Append(int i) {} 
     public void Append(double d) {} 
     public void Append(string s){}i){} 
     public void Append(INetSerializable ins){} 
    } 

d'une autre classe, Je veux appeler cette méthode « générique pour ainsi dire », en passant l'objet

dire 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: Est-ce que pair.Value sera déballé à une primitive correcte? s

Question n ° 2: Problème avec la fonction membre AddParam?

Merci

Répondre

1

n °

Avec le code tel qu'il est, il ne parviendra pas à compiler car il n'y a pas de conversion appropriée de l'objet - > type non-objet. Vous devrez convertir manuellement le code au type approprié.

Une option consiste à fournir une surcharge d'Append de type Object et à y faire la logique.

void Append(object obj) { 
    if (obj is int) { 
    Append((int)obj); 
    } else if (obj is double) { 
    Append((double)obj); 
    ... 
} 

EDIT Question # 2

Il n'y a rien de mal dans le sens où il fonctionne correctement. Cependant, il ne semble pas ajouter de valeur à votre application par rapport à une application non générique qui prend un paramètre d'objet.

+0

Ce sera douloureux. Des solutions de contournement autres que celles que vous avez indiquées ou ayant des Dictionnaires différents pour chaque type pris en charge? –

+0

@Sasha, malheureusement, sans un mécanisme de liaison tardive (VB ou C# 4.0) c'est vraiment vous êtes seule option. – JaredPar

+0

Merci, appliqué votre méthode :) –