2017-05-18 3 views
1

Convert.ChangeType("1", typeof(bool)) Rückkehr zu einem LaufzeitfehlerConvert string „1“ oder „0“ wahr oder falsch Bool

ist es eine Möglichkeit, dieses Verhalten zu ändern?

Ich möchte Convert.ChangeType("1", typeof(bool)) return wahr Convert.ChangeType("0", typeof(bool)) Rückkehr false

UPDATE
Lesen Kommentare und Antworten vielleicht habe ich nicht klar genug gewesen

Angenommen, ein Wörterbuch von <object,Type> haben, wo Typ der Zieltyp

foreach (var element in dictionary) 
{ 
    object convVal = Convert.ChangeType(element.Key, element.Value); 
} 

wenn element.Key ist "1" und elemen.Value ist bool würde ich true

Wer bekommen kann mir Anregungen geben ein ähnliches Verhalten

zumindest besser, dass dies etwas zu implementieren:

public static class Convert 
    { 
     public static object ChangeType(object val, Type type) 
     { 
      if (val is string && type == typeof(bool)) 
      { 

       switch (((string)val).Trim().ToUpper()) 
       { 
        case "TRUE": 
        case "YES": 
        case "1": 
        case "-1": 
         return true; 

        default: 
         return false; 
       } 
      } 
      return System.Convert.ChangeType(val, type); 
     } 
    } 

Kann die Typeconverter sein richtiger Weg?

Bitte denken, bevor Kommentare oder Antworten oder Zeichen Frage stellen als

dupliziert
+5

Haben Sie sich die Mühe gemacht, das zu googeln? – tnw

+0

Was ist falsch mit Convert.ToBoolean? – Milster

+0

@Milster Es wird die gleiche Ausnahme ohne eine zusätzliche Umwandlung werfen. _ (wie in Avitus 'Antwort) _ –

Antwort

1

Das Hauptproblem ist, dass die Umwandlung von string-bool auf der Typ-Ebene unterstützt wird, aber nicht für die meisten String-Werte. Das bedeutet, dass Sie zuerst nach Ihren benutzerdefinierten Konvertierungsregeln suchen müssen, bevor Sie auf die Standardkonverter zurückfallen. Einige der CanConvert...-Funktionen geben True zurück, was zu einer Laufzeitausnahme bei der tatsächlichen Konvertierung führt.

Also, um jede Zahl ungleich Null-String für true und Null für false, erste Schecknummern separat zu akzeptieren, dann benutzerdefinierten Typ-Wandler verwenden, falls sie zur Verfügung gestellt werden und fallen zurück auf die Standardwerte, wenn nichts anderes gefunden wird, Sie verwenden sie die folgende könnte:

static object CustomConvert(object value, Type targetType) 
{ 
    decimal numericValue; 
    if ((targetType == typeof(bool) || targetType == typeof(bool?)) && 
     value is string && 
     decimal.TryParse((string)value, out numericValue)) 
    { 
     return numericValue != 0; 
    } 
    var valueType = value.GetType(); 
    var c1 = TypeDescriptor.GetConverter(valueType); 
    if (c1.CanConvertTo(targetType)) // this returns false for string->bool 
    { 
     return c1.ConvertTo(value, targetType); 
    } 
    var c2 = TypeDescriptor.GetConverter(targetType); 
    if (c2.CanConvertFrom(valueType)) // this returns true for string->bool, but will throw for "1" 
    { 
     return c2.ConvertFrom(value); 
    } 
    return Convert.ChangeType(value, targetType); // this will throw for "1" 
} 

Hinweis habe ich nicht überprüfen, ob es sinnvoll ist Convert.ChangeType, nachdem beide Typ-Wandler, um zu versuchen (von und bis) failed bereits ... könnte auch nur eine Ausnahme an dieser Stelle werfen.

0

was:

bool x = myString.Equals("1"); 
+1

Warum die? wahr: falscher Teil? – wkl

+0

Ist nicht die 'myString.Equals (" 1 ")' genug? –

+0

Warum 'Gleich 'und nicht einfach' bool x = str ==" 1 ";'? – i486

2
bool flag = Convert.ToBoolean(Convert.ToInt32("1")); 
+1

Warum die Convert.ToInt32? ToBoolean akzeptiert string. https://msdn.microsoft.com/en-us/library/86hw82a3(v=vs.110).aspx – SilentStorm

+2

@SilentStorm lesen Sie Ihren eigenen Link ... * "Eine Zeichenfolge, die den Wert von entweder' Boolean.TrueString enthält 'oder' Boolean.FalseString' "*, so akzeptiert es string als type, aber es verarbeitet' '1'' nicht zu einem guten Ergebnis. – grek40

2

Ich denke bester Ansatz für diese Situation Gleichung verwendet wie unten;

string myString = "1"; 
bool myBool = myString == "1"; 
0
Convert.ToBoolean(Convert.ChangeType("1", typeof(uint))); 
Verwandte Themen