web-dev-qa-db-ja.com

parseを使用して文字列を任意の型に変換する一般的なParse()関数はありますか?

文字列を、汎用戻り型に基づいてintdate、またはlongなどの汎用型に変換したい。

基本的に、T型のアイテムを返すParse<T>(String)のような関数。

たとえば、intが渡された場合、関数はint.parse内部的に。

77
Karim

System.Convert.ChangeType

あなたの例では、次のことができます:

int i = (int)Convert.ChangeType("123", typeof(int));
DateTime dt = (DateTime)Convert.ChangeType("2009/12/12", typeof(DateTime));

「汎用戻り型」要件を満たすために、独自の拡張メソッドを作成できます。

public static T ChangeType<T>(this object obj)
{
    return (T)Convert.ChangeType(obj, typeof(T));
}

これにより、次のことが可能になります。

int i = "123".ChangeType<int>();
110
Ani

私はこのスレッドで答えるには遅すぎるようです。しかし、ここに私の実装があります:

基本的に、ObjectクラスのExtentionメソッドを作成しました。すべてのタイプ、つまりnullable、クラス、および構造体を処理します。

 public static T ConvertTo<T>(this object value)
           {
               T returnValue;

               if (value is T variable)
                   returnValue = variable;
               else
                   try
                   {
                       //Handling Nullable types i.e, int?, double?, bool? .. etc
                       if (Nullable.GetUnderlyingType(typeof(T)) != null)
                       {
                           TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
                           returnValue = (T) conv.ConvertFrom(value);
                       }
                       else
                       {
                           returnValue = (T) Convert.ChangeType(value, typeof(T));
                       }
                   }
                   catch (Exception)
                   {
                       returnValue = default(T);
                   }

               return returnValue;
           }
18
Pranay Deep

System.Convert.ChangeTypeはどの型にも変換しません。次のことを考えてください:

  • nullable型
  • 列挙型
  • ガイドなど.

これらの変換は ChangeTypeのこの実装 で可能です。

10
Alex Siepman

Pranay's answer のクリーナーバージョン

public static T ConvertTo<T>(this object value)
{
    if (value is T variable) return variable;

    try
    {
        //Handling Nullable types i.e, int?, double?, bool? .. etc
        if (Nullable.GetUnderlyingType(typeof(T)) != null)
        {
            return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value);
        }

        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch (Exception)
    {
        return default(T);
    }
}
6
Eonasdan

.NETには、1つのタイプのオブジェクトを別のタイプに変換するためのいくつかの規則があります。

ただし、これらのメソッドは通常のT.Parse(string)よりもはるかに遅く、ボクシングを引き起こし、単一の値を変換するたびに多くの割り当てを伴います。

ValueString の場合、リフレクションを使用するタイプの適切な静的解析メソッドを見つけ、それを呼び出すラムダ式を構築し、将来の使用のためにコンパイル済みデリゲートをキャッシュすることを選択しました( this answer =例)。

また、型に適切な解析メソッドがない場合は、前述の方法にフォールバックします(readmeの performance section を参照)。

var v = new ValueString("15"); // struct
var i = v.As<int>(); // Calls int.Parse.
0
Şafak Gür