2011-02-10 9 views
4

私は型Tの変数xと文字列内の値を持っています。 は、例えば、私が持っている:実行時の型の割り当て

bool x, value = "True" 
int x, value = "1" 
  • は、xに値をデシリアライズ/パース/割り当てるための汎用的な方法はありますか?

Tは、参照型またはプリミティブ型です。

+1

問題は、あなたではないです**割り当てます**タイプ、**あなたは**値を変換しています**。したがって、 'string'を' anything'に変換する方法を提供する必要があります。 'Parse'メソッドのように...あなたはそれを反映させることができます。 –

答えて

5

Convert.ChangeType methodを使用できます。

これは、すべての基本タイプの変換を対象とします。

例:var i = Convert.ChangeType("1", typeof(int));

また、あなたは別のタイプからかに独自のオブジェクトを変換するために使用することができますIConvertible interfaceを見てみることができます。

最後に、codymanixによると、OOB XmlSerializationまたはBinary Serializationを使用してオブジェクトをシリアル化することができます。

[編集]ターゲット・タイプは、このようなユーティリティクラスでconvert.ChangeTypeメソッドをラップすることにより、変換可能な場合は、コンパイル時にチェックすることができます。

public static class ConvertUtility 
{ 
    public static T Convert<T>(object source) where T : IConvertible 
    { 
     return (T)System.Convert.ChangeType(source, typeof(T)); 
    }    
} 
+0

@ Steve私はConvert.ChangeTypeを試しました。しかし、すべてのネイティブタイプがIConvertibleを実装するわけではありません。私はConvert.ChangeType(value、typeof(T))を試しました。 –

+0

+1 @Steve Strangeもう一度やってみて、同じ問題は起こらないよ。 –

+0

@amir:私の編集を見て...それはあなたを助けるかもしれない –

0

私がやっ以外の方法を知っている:

object x; 
if (theType==typeof(int)) 
    x = int.parse(myString); 
else if (theType==typeof(bool)) 
    x = bool.Parse(myString); 
// and so on for other types.. 

はまた、あなたがそうでなければ、「123」は、int型またはunsigned short型または何であるかどうかを知るためにはチャンスを持っていないため、シリアル化されたデータは、型の名前が含まれている必要があることに注意たとえば、「赤」が列挙型の値であれば、Colorオブジェクトまたは文字列です。

XmlSerializerまたはBinaryFormatterを使用してオブジェクトをシリアライズ/デシリアライズすることができます。これにより、すべてのロジックがすでに処理されています。

1

私はこのリフレクションに基づくアプローチをしばらく前に書きました。しかし、それは比較的テストされていません。 ParseTryParseというメソッドを探します。そして、私はロケール(依存)依存解析も処理しませんでした。

private static class ParseDelegateStore<T> 
    { 
     public static ParseDelegate<T> Parse; 
     public static TryParseDelegate<T> TryParse; 
    } 

    private delegate T ParseDelegate<T>(string s); 
    private delegate bool TryParseDelegate<T>(string s, out T result); 


    public static T Parse<T>(string s) 
    { 
     ParseDelegate<T> parse = ParseDelegateStore<T>.Parse; 
     if (parse == null) 
     { 
      parse = (ParseDelegate<T>)Delegate.CreateDelegate(typeof(ParseDelegate<T>), typeof(T), "Parse", true); 
      ParseDelegateStore<T>.Parse = parse; 
     } 
     return parse(s); 
    } 

    public static bool TryParse<T>(string s, out T result) 
    { 
     TryParseDelegate<T> tryParse = ParseDelegateStore<T>.TryParse; 
     if (tryParse == null) 
     { 
      tryParse = (TryParseDelegate<T>)Delegate.CreateDelegate(typeof(TryParseDelegate<T>), typeof(T), "TryParse", true); 
      ParseDelegateStore<T>.TryParse = tryParse; 
     } 
     return tryParse(s, out result); 
    } 
+0

本当に素晴らしいです!非常にうまくいきます! –

関連する問題