2009-09-11 6 views
0

Comment puis-je faire en sorte que cette fonction jette fiable sourceValue au type T où sourceValue est booléen et T est int?Convertir bool à T où T est int

 
public static T ConvertTo<T>(Object sourceValue) 
{ 
    // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY 
    if (sourceValue is T) 
    return (T) sourceValue; 

    var val = ConvertTo(sourceValue, typeof (T)); 
    return (T) val; 
} 

Actuellement, cela jette un InvalidCastException en essayant de convertir faux à 0 et fidèle à 1. Les types ne sont pas prédéfinis, ce qui explique pourquoi les médicaments génériques doivent être utilisés ici. Cependant, le seul cas où il échoue est lorsque T: Int32 et sourceValue: Boolean.

+1

Juste curieux, mais pourquoi voulez-vous utiliser une méthode autonome pour cela? Si 'b' est un' bool', faites juste 'int x = b? 1: 0; – bcat

+0

Je pense qu'il est à la recherche d'une solution générique, mais cette affaire "edge" ne va pas. – spender

+0

Probablement. Je ne vois tout simplement pas de cas d'utilisation pour une méthode de conversion générique. Je ne dis pas que ce n'est pas valable, je ne peux pas y penser pour le moment. – bcat

Répondre

4

Est-ce que false = 0 et true = 1? Peut-être dans d'autres langues, mais ici la distribution n'a aucun sens. Si vous en avez vraiment besoin, je pense que c'est un cas particulier.

+0

+1 cela ne semble pas garantir les génériques, si les types sont prédéfinis. –

+1

'Convert.ToInt32' fait exactement cela - convertit false à 0 et true à 1. Je suppose que cela a du sens. – Kobi

+0

Les types ne sont pas prédéfinis, c'est pourquoi les génériques doivent être utilisés ici. Cependant, le seul cas où il échoue est lorsque T: Int32 et sourceValue: Boolean. –

2

Je pense que la conversion d'un bool en un int est indéfinie. Cependant, je ne crois pas qu'il soit approprié d'écrire explicitement ce cas particulier dans votre fonction, sinon votre fonction est incongrue avec la façon dont .NET traite implicitement ints et bools.

Vous êtes mieux écrit:

int value = someFlag ? 1 : 0; 
0

je besoin d'une solution très générique. C'est le meilleur que je pouvais venir avec:

 
public static T ConvertTo(Object sourceValue) 
    { 
     // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY 
     if (sourceValue is T) 
     return (T) sourceValue; 

     var val = ConvertTo(sourceValue, typeof (T)); 

     // SPECIAL CASE: Convert bool(sourceValue) to int(T) 
     if (val is bool) 
     { 
     var b = (bool) val; 
     if (b) 
      return (T) (object) 1; // if val is true, return 1 

     return (T) (object) 0; 
     } 

     return (T) val; 
    } 
+1

@Mark: Cela ne compile pas, le même que l'exemple original dans votre question. Les deux exemples appellent une autre surcharge de la méthode 'ConvertTo' que vous ne nous montrez pas. Si vous nous donnez un code que nous pouvons compiler et tester, je suis sûr que quelqu'un sera en mesure de vous aider. – LukeH

+0

Quelqu'un pourrait-il baisser le prix pour la raison que Luc donne. Je n'ai pas assez de rep. –

+0

@KrisAdams Raison? –

1

Pas tout à fait sûr de ce que vous essayez de faire, mais .net réalise une conversion de soutien de bool à int:

Convert.ToInt32(true); 

Il peut également prendre un object, et comprendre si c'est bool.
Voir aussi: Convert.ToInt32(bool), Convert.ToInt32(Object)

0

En tant que suivi propre réponse de Marc. Je pense que c'est une solution décente:

 protected Nullable<T> ConvertTo<T>(Object sourceValue) where T : struct, IComparable 
    { 
     if (sourceValue is T) 
      return (T)sourceValue; 

     if (sourceValue == null) 
     { 
      return null; 
     } 
     try 
     { 
      var val = Convert.ChangeType(sourceValue, typeof(T)); 
      return (T)val; 
     } 
     catch (FormatException) 
     { 
      return null; 
     } 

    } 
+0

Je n'ai plus besoin de résoudre ce problème, mais si quelqu'un peut vérifier que ce code compile, je marquerai cela comme la réponse. –

Questions connexes