44

特定の型のデフォルト値を返すメソッドが必要で、そのメソッドがジェネリックである場合、次のようにデフォルト値を返すことができます。

public static T GetDefaultValue()
{
  return default(T);
}

タイプをオブジェクトとしてのみ持っている場合、同様のことを行うことはできSystem.Typeますか?

public static object GetDefaultValue(Type type)
{
  //???
}
4

3 に答える 3

74

実際には値の型だけを気にする必要があるため (参照型は単に null になります)、 を使用Activator.CreateInstanceしてそれらの既定のコンストラクターを呼び出すことができます。

public static object GetDefaultValue(Type type) {
   return type.IsValueType ? Activator.CreateInstance(type) : null;
}

編集:ジョンは(もちろん)正しいです。IsClass網羅的ではありません -がインターフェースであるFalse場合に返さtypeれます。

于 2009-08-15T04:58:57.007 に答える
7

これが私が通常行う方法です。これにより、「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);
}
于 2010-05-07T17:39:54.030 に答える
0

ジェネリックがないと、型にパラメーターなしのコンストラクターがあることを保証できませんが、リフレクションを使用して検索できます。

public static object GetDefaultValue(Type type)
{
    ConstructorInfo ci = type.GetConstructor( new Type[] {} );
    return ci.Invoke( new object[] {} );
}

これをコンソールアプリで試してみたところ、クラスの「デフォルト」インスタンスが返されました—それがクラスであると仮定します。参照型でも機能する必要がある場合は、追加の手法が必要になります。

于 2009-08-15T04:46:11.167 に答える