特定の型のデフォルト値を返すメソッドが必要で、そのメソッドがジェネリックである場合、次のようにデフォルト値を返すことができます。
public static T GetDefaultValue()
{
return default(T);
}
タイプをオブジェクトとしてのみ持っている場合、同様のことを行うことはできSystem.Type
ますか?
public static object GetDefaultValue(Type type)
{
//???
}
実際には値の型だけを気にする必要があるため (参照型は単に null になります)、 を使用Activator.CreateInstance
してそれらの既定のコンストラクターを呼び出すことができます。
public static object GetDefaultValue(Type type) {
return type.IsValueType ? Activator.CreateInstance(type) : null;
}
編集:ジョンは(もちろん)正しいです。IsClass
網羅的ではありません -がインターフェースであるFalse
場合に返さtype
れます。
これが私が通常行う方法です。これにより、「IsValueType」全体またはコンストラクターの検索の問題を完全に回避できます。
public static object MakeDefault(this Type type)
{
var makeDefault = typeof(ExtReflection).GetMethod("MakeDefaultGeneric");
var typed = makeDefault.MakeGenericMethod(type);
return typed.Invoke(null, new object[] { });
}
public static T MakeDefaultGeneric<T>()
{
return default(T);
}
ジェネリックがないと、型にパラメーターなしのコンストラクターがあることを保証できませんが、リフレクションを使用して検索できます。
public static object GetDefaultValue(Type type)
{
ConstructorInfo ci = type.GetConstructor( new Type[] {} );
return ci.Invoke( new object[] {} );
}
これをコンソールアプリで試してみたところ、クラスの「デフォルト」インスタンスが返されました—それがクラスであると仮定します。参照型でも機能する必要がある場合は、追加の手法が必要になります。