5

さて、私はジェネリックについて学んでおり、これを実行しようとしていますが、同じエラーが表示され続けます。コードは次のとおりです。

public static T Test<T>(MyClass myClass) where T : MyClass2
{
    var result = default(T);
    var resultType = typeof(T);
    var fromClass = myClass.GetType();
    var toProperties = resultType.GetProperties();

    foreach (var propertyInfo in toProperties)
    {
        var fromProperty = fromClass.GetProperty(propertyInfo.Name);
        if (fromProperty != null)
            propertyInfo.SetValue(result, fromProperty, null );
    }

    return result;
}
4

3 に答える 3

9

これは、 returnが参照型を表すために発生しdefault(T)ます。参照型のデフォルト値はです。nullTnull

メソッドを次のように変更できます。

public static T Test<T>(MyClass myClass) where T : MyClass2, new()
{
    var result = new T();
    ...
}

そしてそれはあなたが望むように動作します。もちろん、MyClass2その子孫にはパラメーターなしのコンストラクターが必要です。

于 2010-08-26T16:54:06.823 に答える
3

ここでの問題は、参照型Tから派生しMyClass、したがって参照型であるということです。したがって、式default(T)は値を返しますnull。次のSetValueの呼び出しはnull値を操作していますが、プロパティはインスタンスプロパティであるため、指定されたメッセージが表示されます。

次のいずれかを行う必要があります

  1. の実インスタンスをTTest関数に渡して、プロパティ値をに設定します
  2. タイプに静的プロパティのみを設定します
于 2010-08-26T16:53:18.633 に答える
1

それ以外の

propertyInfo.SetValue(result, fromProperty, null);

試す:

foreach (var propertyInfo in toProperties)  
{ 
    propertyInfo.GetSetMethod().Invoke(MyClass2, new object[] 
    { 
        MyClass.GetType().GetProperty(propertyInfo.Name).
        GetGetMethod().Invoke(MyClass, null)
    });
}
于 2011-09-01T20:28:21.347 に答える