0

明らかに、これはあなたが無力な状況にない限りやりたいことではありませんが、誰かがこのようなことの良い例を持っていますか (より明確なメソッド名を考えるためのボーナスポイント):

public static object ConvertToBestGuessPrimitive(string toConvert)
{
    if(looksLikeAnInt)
    {
        return as an int;
    }
    else if(looksLikeABoolean)
    {
        return as a boolean;
    }
    else
    {
        return as a string;
    }
}

私が持っていた唯一のアイデアは、一連の TryParse メソッドを適切な順序で連鎖させ、何も機能しない場合は文字列にフォールバックすることでした。誰かがより良いものを考えることができますか? この質問はおそらくどこかですでに回答されていますが、あまりにも一般的な検索用語が使用されているため、有用な結果を見つけることができないようです.

編集 - これが例なしでどれほど有用であるかについていくつかの批判があったので、具体的な必要性を満たすために私が思いついたものをここに示します (信じがたいですが)...制御されていないソースから取得したエラーログファイルを解析しているとしましょう. ログ ファイルには、エラーが発生した場所に提供されたメソッド名と引数が含まれています。最も一致するメソッドと引数を見つけて再度呼び出すことにより、エラー条件のテストを自動化したいと考えています。ばかげた例かもしれません (これは単なる例であるため、「しかし、このシナリオではこれを行うことができます」という回答を考え出さないでください) が、いくつかの点を示しています。2) 最良の推測は、適切な一致を見つけるためのいくつかの基準に基づいています。例: "10/2/2012" は、文字列よりも DateTime を意味する可能性が高くなります。

4

2 に答える 2

1

それで、if-else を取り除こうとしているのですか?このようなものはどうですか:

interface IConverter
{
  bool TryConvert(string obj, out object result);
}

class IntConvert : IConverter
{
  public bool TryConvert(string obj, out object result) { /* stuff here */ }
}

class BoolConverter : IConverter {...}

// etc.
List<IConverter> converters = new List<IConverter>();
converters.Add(new IntConvert());
converters.Add(new BoolConvert());

public static object ConvertToBestGuessPrimitive(string toConvert)
{
  object obj;
  foreach(var converter in converters) {
    if(converter.TryConvert(toConvert, out obj))
       return obj;
  }

  return null;
}

更新:提案してくれたServyに感謝します。

于 2013-02-11T15:07:59.910 に答える
0

実際、解析は文化固有であるため、解析を試みるのが最も適切な方法です。.NET Framework に解析を要求するだけで、現在のカルチャ設定に自動的に準拠します。これは、手動の解析アプローチ (正規表現に基づく可能性がある) とは対照的です。

また、bool、int、float、DateTime の間であいまいに解釈できる文字列を知りません。(任意の int も浮動小数点数であるため、最初に int を解析するという明らかな例外があります)。

より適切な名前はConvertToBestGuessPrimitiveType. 「種類」を追加しました。

于 2013-02-11T15:05:09.873 に答える