3

まず、私がやりたいのは、ジェネリッククラスのプロパティの値を取得することです。このプロパティの値は、それを継承するクラスによってオーバーライドされる可能性があります。基本クラスでは、クラスの継承者がオーバーライドして独自のデフォルト値を設定できることをデフォルト値と考えてください。

System.Reflection.FieldInfo.GetValueを使用して、型に直接リフレクションを使用しようとしましたが、これはジェネリック型のクラスでは機能しません。したがって、値が何であるかを確認できるように、クラスをインスタンス化する必要があると思います。

ビン内のDLLを読み取り、Reflectionを使用してインターフェイスから継承するタイプを見つけることにより、取得した「タイプ」。

.NET4.5を使用しています

これは、私が行う必要があることを正確に説明しているように見えるドキュメントです http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx

このドキュメントで私が見ることができる唯一の違いは、型を取得する方法です。ビンで型を調べ、単にtypeof()と呼びました。型は非常に複雑であるため、これはおそらく不一致である可能性がありますが、わかりません。何が欠けているか(もしあれば)

foreach (var item in types)
{
    var ts = item.GetField("DefaultTimeToExpire");
    Type[] typeArguments = item.GetGenericArguments();
    if (ts != null)
    {
        var t = item.MakeGenericType(typeArguments);
        var obj = Activator.CreateInstance(t);
        var timespan = obj.DefaultTimeToExpire;
        subscriberInfos.Add(new Tuple<string, Type, TimeSpan>(item.Name, item, timespan));
    }
}

GetFieldを呼び出して、フィールドが「DefaultTimeToExpire」のアイテムを探しています。これまでのところ、この部分は必要なタイプを見つけるのに適しています。次に、引数タイプの期待される配列を返すGetGenericArgumentsを呼び出します。次に、MakeGenericTypeを呼び出し、最後にインスタンスを作成してエラーメッセージを表示します

Type.ContainsGenericParametersがtrueであるため、BusinessLogic.TestSubscriberXXX`1[メッセージ]のインスタンスを作成できません。」

これはまさに私がやるべきことのように見えます。ありがとう

4

1 に答える 1

4

ジェネリック型をインスタンス化するには、型パラメーターの代わりに使用する必要がある実際の値(型)を知る必要があります。このGetGenericArguments()メソッドはリフレクションの形式であり、実際の値ではなく、型引数のみを提供します。値はあなた次第です...それがジェネリックの要点です。

itemがのようなタイプの場合、タイプパラメータを表す偽の「タイプ」を含む配列を返しますList<T>(プロパティはtrueに設定されています)。したがって、そのパラメーター型をに戻すと、元の型と同等の別のオープンジェネリック型が作成されます。ジェネリック型を閉じてインスタンス化できるようにするには、などの実際の(パラメーターではない)型引数を指定する必要があります。item.GetGenericArguments()TIsGenericParameteritem.MakeGenericType()int

たとえば、typeof(List<>).MakeGenericType(typeof(int))はを返しますtypeof(List<int>)が、 typeof(List<>).MakeGenericType(typeof(List<>).GetGenericArguments())は単にtypeof(List<>)再び戻ります。これがあなたのコードで起こっていることです。

それが少し不透明な場合は申し訳ありませんが、他に説明する方法がわかりません。肝心なのは、のようなタイプはList<T>、の代わりに置き換えたいタイプがある場合にのみ役立つということですT

于 2012-08-29T14:04:38.077 に答える