2010-04-22 5 views
1

Je pense que je me suis surpassé cette fois-ci. N'hésitez pas à éditer le titre aussi je ne pourrais pas penser à un bon. Je lis d'un fichier et ensuite dans ce fichier sera une chaîne parce que c'est comme un fichier XML. Mais dans le fichier sera une valeur littérale ou une « commande » pour obtenir la valeur de la workContainerUtilisation de Generics pour renvoyer une chaîne littérale ou de Dictionary <string, object>

si

<Email>[email protected]</Email> 

ou

<Email>[? MyEmail ?]</Email> 

Ce que je voulais faire au lieu de ifs d'écriture dans tous les sens pour le mettre dans une fonction générique

si la logique est

If Container command grab from container else grab string and convert to desired type 
Its up to the user to ensure the file is ok and the type is correct 

donc un autre exemple est

si

<Answer>3</Answer> 

ou

<Answer>[? NumberOfSales ?]</Answer> 

C'est la procédure que j'ai commencé à travailler sur

public class WorkContainer:Dictionary<string, object> 
{ 
    public T GetKeyValue<T>(string Parameter) 
    { 
     if (Parameter.StartsWith("[? ")) 
     { 
      string key = Parameter.Replace("[? ", "").Replace(" ?]", ""); 

      if (this.ContainsKey(key)) 
      { 
       return (T)this[key]; 
      } 
      else 
      { 
       // may throw error for value types 
       return default(T); 
      } 

     } 
     else 
     { 
      // Does not Compile 
      if (typeof(T) is string) 
      { 
       return Parameter 
      } 
      // OR return (T)Parameter 

     } 
    } 
} 

L'appel serait

mail.To = container.GetKeyValue<string>("[email protected]"); 

ou

mail.To = container.GetKeyValue<string>("[? MyEmail ?]"); 

    int answer = container.GetKeyValue<int>("3"); 

ou

answer = container.GetKeyValue<int>("[? NumberOfSales ?]"); 

Mais il ne compile pas?

+0

Quelle erreur de compilation que vous obtenez? –

Répondre

0

Voici donc la réponse que je suis venu avec, je suis un peu inquiet de la boxe et unboxing mais il fonctionne pour l'instant

public class WorkContainer:Dictionary<string, object> 
{ 
    public T GetKeyValue<T>(string Parameter) 
    { 
     if (Parameter.StartsWith("[? ")) 
     { 
      string key = Parameter.Replace("[? ", "").Replace(" ?]", ""); 

      if (this.ContainsKey(key)) 
      { 
       if (typeof(T) == typeof(string)) 
       { 
        // Special Case for String, especially if the object is a class 
        // Take the ToString Method not implicit conversion 
        return (T)Convert.ChangeType(this[key].ToString(), typeof(T)); 
       } 
       else 
       { 
        return (T)this[key]; 
       } 
      } 
      else 
      { 
       return default(T); 
      } 

     } 
     else 
     {     
      return (T)Convert.ChangeType(Parameter, typeof(T)); 
     } 
    } 
} 
0

La ligne

if (typeof(T) is string) 

vaudra toujours sine fausse l'opérateur typeof donne un objet de type. Vous devez le remplacer par

if (T is string) 

En outre, vous devriez regarder la méthode Convert.ChangeType. Cela peut être utile ici.

+0

Err ... non. Votre solution ne compilera pas. L'opérateur 'is' est utilisé pour déterminer si une * valeur * (variable, littérale ou constante) est d'un * type * particulier. Il ne peut pas être utilisé pour comparer deux types *. –

+0

Je vous ai donné +1 car même si votre T est une chaîne incorrecte, Convert.ChangeType était la clé. – Mike

2
if(typeof(T) == typeof(string)) 
{ 
    return (T)Parameter; 
} 
else 
{ 
    // convert the value to the appropriate type 
} 
+0

Toujours des erreurs Impossible de convertir implicitement le type 'chaîne' en 'T' – Mike

+0

@Mike: Mon erreur; même avec la logique là-bas, une distribution est toujours nécessaire. J'ai édité la réponse. –

0

Utilisez typeof(T) == typeof(string)

0

Change:

if (typeof(T) is string) 

à:

if (typeof(T) == typeof(String)) 

L'opérateur est est valable uniquement sur les instances de classe. T n'est pas réellement une instance c'est un type, par conséquent utiliser n'est pas compiler dans votre code parce que vous devez comparer 2 types. Vous pouvez en savoir plus sur msdn here.

+0

Même si if (typeof (T) == typeof (String)) fonctionne, le retour était toujours un problème Erreurs fixes Impossible de convertir implicitement le type 'chaîne' en 'T' – Mike

Questions connexes