文字列を、汎用戻り型に基づいてint
、date
、またはlong
などの汎用型に変換したい。
基本的に、T
型のアイテムを返すParse<T>(String)
のような関数。
たとえば、intが渡された場合、関数はint.parse
内部的に。
あなたの例では、次のことができます:
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>();
私はこのスレッドで答えるには遅すぎるようです。しかし、ここに私の実装があります:
基本的に、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;
}
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);
}
}
.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.