インターフェイスを反映して、ジェネリック型パラメーターと戻り値の型の差異を検出する方法はありますか? つまり、リフレクションを使用して 2 つのインターフェイスを区別できますか。
interface IVariant<out R, in A>
{
R DoSomething(A arg);
}
interface IInvariant<R, A>
{
R DoSomething(A arg);
}
両方の IL は同じに見えます。
インターフェイスを反映して、ジェネリック型パラメーターと戻り値の型の差異を検出する方法はありますか? つまり、リフレクションを使用して 2 つのインターフェイスを区別できますか。
interface IVariant<out R, in A>
{
R DoSomething(A arg);
}
interface IInvariant<R, A>
{
R DoSomething(A arg);
}
両方の IL は同じに見えます。
ジェネリック型のバリアンス フラグを決定するために使用できるGenericParameterAttributes Enumerationがあります。
ジェネリック型を取得するにtypeof
は、型パラメーターを使用しますが省略します。パラメーターの数を示すためにコンマを残します (リンクのコード):
Type theType = typeof(Test<,>);
Type[] typeParams = theType.GetGenericArguments();
その後、型パラメーター フラグを調べることができます。
GenericParameterAttributes gpa = typeParams[0].GenericParameterAttributes;
GenericParameterAttributes variance = gpa & GenericParameterAttributes.VarianceMask;
string varianceState;
// Select the variance flags.
if (variance == GenericParameterAttributes.None)
{
varianceState= "No variance flag;";
}
else
{
if ((variance & GenericParameterAttributes.Covariant) != 0)
{
varianceState= "Covariant;";
}
else
{
varianceState= "Contravariant;";
}
}