2012-08-24 8 views
6

私は文字列にこれを行うための拡張メソッドを持っています。("true").As<bool>(false) 特にブール値の場合は、カスタム変換を行うのにAsBool()を使用します。 どういうわけか私はTからBoolにキャストできず、その逆もありません。私はそれが次のコードを使用して動作しているが、それは過度のビットのように見えます。ブールにTをキャストするか、逆にする

これは、この行についてです:
(T)Convert.ChangeType(AsBool(value, Convert.ToBoolean(fallbackValue)), typeof(T))
は、私はむしろ、以下を使用しますが、それはコンパイルされません。
(T)AsBool(value, (bool)fallbackValue), typeof(T))

は、私が何かをしないのですか、これは行くための最短の方法です?

public static T As<T>(this string value) 
    { 
     return As<T>(value, default(T)); 
    } 
    public static T As<T>(this string value, T fallbackValue) 
    { 
     if (typeof(T) == typeof(bool)) 
     { 
      return (T)Convert.ChangeType(AsBool(value, 
               Convert.ToBoolean(fallbackValue)), 
               typeof(T)); 
     } 
     T result = default(T); 
     if (String.IsNullOrEmpty(value)) 
      return fallbackValue; 
     try 
     { 
      var underlyingType = Nullable.GetUnderlyingType(typeof(T)); 
      if (underlyingType == null) 
       result = (T)Convert.ChangeType(value, typeof(T)); 
      else if (underlyingType == typeof(bool)) 
       result = (T)Convert.ChangeType(AsBool(value, 
               Convert.ToBoolean(fallbackValue)), 
               typeof(T)); 
      else 
       result = (T)Convert.ChangeType(value, underlyingType); 
     } 
     finally { } 
     return result; 
    } 
    public static bool AsBool(this string value) 
    { 
     return AsBool(value, false); 
    } 
    public static bool AsBool(this string value, bool fallbackValue) 
    { 
     if (String.IsNullOrEmpty(value)) 
      return fallbackValue; 
     switch (value.ToLower()) 
     { 
      case "1": 
      case "t": 
      case "true": 
       return true; 
      case "0": 
      case "f": 
      case "false": 
       return false; 
      default: 
       return fallbackValue; 
     } 
    } 

答えて

5

あなたはTobjectし、その後にそれをキャストすることができます:

if (typeof(T) == typeof(bool)) 
{ 
    return (T)(object)AsBool(value, Convert.ToBoolean(fallbackValue)); 
} 
+3

がたくさんクリーナー、このように:)見えます。私が直接キャストできない理由は何ですか? – Silvermind

関連する問題