1

私は次のように定義されたマーカーインターフェイスを持っています

public interface IExtender<T>
{
}

IExtenderを実装するクラスがあります

public class UserExtender : IExtender<User>

実行時に、評価メソッドのパラメーターとしてUserExtenderタイプを受け取ります

public Type Evaluate(Type type) // type == typeof(UserExtender)

Evaluateメソッドを返すにはどうすればよいですか

typeof(User)

実行時の評価に基づいています。リフレクションが関係していると確信していますが、それをクラックすることはできないようです。

(この質問の言い方がわかりませんでした。十分に明確であることを願っています。)

4

3 に答える 3

1

GetGenericTypeDefinitionメソッドのMSDNドキュメントで説明したことを実行する例があります。GetGenericArgumentsメソッドを使用します。

Type[] typeArguments = t.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
foreach (Type tParam in typeArguments)
{
    Console.WriteLine("\t\t{0}", tParam);
}

あなたの例では、に置き換えたいと思いtますthis。それが直接機能しない場合は、GetInterfacesメソッドを使用して何かを実行し、タイプの現在のインターフェイスを列挙してGetGenericArguments()から、インターフェイスタイプから列挙する必要があります。

于 2008-09-22T06:09:14.253 に答える
1

私はあなたの質問を他の回答とはまったく異なる方法で読みました。

評価署名を次のように変更できる場合:

public Type Evaluate<T>(IExtender<T> it)
{
    return typeof(T);
}

これには、呼び出しコードを変更する必要はありませんが、パラメーターが typeIExtender<T>である必要がありますが、 type は簡単に取得できますT

// ** compiled and tested    
UserExtender ue = new UserExtender();
Type t = Evaluate(ue);

Type確かに、パラメータを取るだけのものほど一般的ではありませんが、これは問題に対する別の見方です。また、リフレクションのセキュリティに関する考慮事項があることにも注意してください [msdn]

于 2008-09-22T11:31:36.040 に答える
1

提供されたいくつかのヒントに基づいて、この方法で行きました。インターフェイスで複数の一般的な引数を処理するために、より堅牢にすることができます....しかし、私はそれを必要としませんでした;)

private static Type SafeGetSingleGenericParameter(Type type, Type interfaceType)
{
    if (!interfaceType.IsGenericType || interfaceType.GetGenericArguments().Count() != 1)
        return type;

    foreach (Type baseInterface in type.GetInterfaces())
    {
        if (baseInterface.IsGenericType &&
                baseInterface.GetGenericTypeDefinition() == interfaceType.GetGenericTypeDefinition())
        {
            return baseInterface.GetGenericArguments().Single();
        }
    }

    return type;
}
于 2008-09-22T06:27:08.220 に答える