2011-06-16 15 views
1

私はは、Tは、いくつかの特定のタイプであれば、なぜ私がチェックすることはできませんし、それに応じてParseメソッドを使用して...文字列から解析された値を返すことができ、一般的な方法一般的な文字列パーサ

public T GetDefaultValue<T>(){ 
    // if typeof(T) is Double it should try to parse some string (supposedly which's been read from DB), 
    // and return Double value, or if typeof(T) is Int, then it should parse the string 
    //into Int, and finally if typeof(T) is a string, then no parsing is needed. 
} 

UPDを必要とします?

+0

これをお読みください:http://tinyurl.com/so-hints – Oded

+0

http://stackoverflow.com/questions/6160329/is-it-possible-to-make-a-generic-number-parser-in -c同様の質問です。しかし、私はそれが正確な重複としてカウントされているかどうかは分かりません。 – CodesInChaos

答えて

2

Convert.ChangeTypeを使用してコンバージョンを達成することができます。

public T Parse<T>(string input) 
{ 
    return (T)Convert.ChangeType(input, typeof(T)); 
} 

int x = Parse<int>("1"); 
double y = Parse<double>("1.0"); 
string z = Parse<string>("hey"); 

このようにしても、タイプを指定していることに注意してください。 int.Parse(またはTryParse)、double.Parseなどを使用した場合の節約額はどのくらいですか?

そして、あなたはあなたの入力が可能性が高いデータベースから来て、まださえにすでにtypeパラメータを指定する必要があり、上記の方法を使用することを知っているもちろんのことから、私は(A)にことをお勧めします知っているとあなたを信頼(b)データソースから値を取得するために既存の機能を使用する。何かを文字列に変換して、それを元にしたいデータ型に変換する必要はありません。

int x = myDataRow.Field<int>("Column1"); // or 
int x = (int)myDataRow["Column1"]; 

これは、数値がデータベースでNULL可能である可能性がある場合にもサポートされます。

int? x = myDataRow.Field<int?>("Column1"); // or 
int x = myDataRow.Field<int?>("Column1").GetValueOrDefault(); // normalize nulls to 0 
1

これにジェネリックを使用するポイントは何ですか?あなたは実際のタイプをチェックすることによってジェネリックのすべての利益を失います。

intの1つ、doubleの1つ、(おそらく不要な)stringの3つのオーバーロードがあります。

+1

正しいメソッドを覚えている場合は、戻り値の型でのみ署名が異なることはできません。 – Agzam

+0

@Agzam - 正しく呼び戻します。しかし、 'int'と' double'とを 'string'に渡すと、それらは異なる_parameter_型です。 – Oded

1

ジェネリックスなしでこれを行うことができます。なぜあなたが必要とするすべての針

class Test 
    { 
     public string ReadFromDb() 
     { 
      //Do your db work here 
      return ""; 
     } 

     public bool GetDefaultValue(ref int t1) 
     { 
      t1 = Int32.Parse(ReadFromDb()); 
      return true; 
     } 

     public bool GetDefaultValue(ref double t1) 
     { 
      t1 = Double.Parse(ReadFromDb()); 
      return true; 
     } 

     public bool GetDefaultValue(ref string t1) 
     { 
      t1 = ReadFromDb(); 
      return true; 
     } 
    } 
1

あるとき、私はちょうど

public static int xToInt(this string source, int alternate = 0) 
{ 
    int result; 
    return (int.TryParse(source, out result) ? result : alternate); 
} 

のような文字列の拡張を行ってから、ちょうどダブルのための1つを作成し、その後、

を行うことによって、それを使用することができます剣を使います
int someNumber = "123456".xToInt(); 
int someNumber2 = "omg!".xToInt(333); 
1

私は適切なParse方法を検索し、それを呼び出すためにリフレクションを使用する一般的な方法を書きました。しかし、stringstringに変換する場合は、stringにはParseメソッドがないので、それらは機能しません。したがって、stringの特殊ケースを追加する必要があります。

なぜあなたの機能がGetDefaultValueと呼ばれているのかわかりません。どうしてですか?ParseTryParseConvertFromStringなどですか? GetDefaultValueという関数を見ると、私は解析関数を考えません。

この古い質問を確認してください: Is it possible to make a generic number parser in C#?これにはいくつかの関連する回答があります。

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); 
} 

https://github.com/CodesInChaos/ChaosUtil/blob/master/Chaos.Util/Conversion.cs:私はタイプのParse/TryParse方法を見つけて、汎用的な機能から、これらにアクセスするためにリフレクションを使用していくつかのコードを書かれている


そして、そこから私の古い答え

しかし、私はあまりにもそれらをテストしていないので、彼らはいくつかのバグを持っているかもしれない/電子で正しく動作しません非常にタイプ。エラー処理には少し欠けています。

そして、それらは、文化不変の解析のための過負荷がありません。おそらくそれを追加する必要があります。

関連する問題