質問

インターフェイスを反映して、その汎用型パラメーターとリターンタイプの分散を検出する方法はありますか?言い換えれば、反射を使用して2つのインターフェイスを区別できますか?

interface IVariant<out R, in A>
{
   R DoSomething(A arg);
}


interface IInvariant<R, A>
{
   R DoSomething(A arg);
}

両方のILは同じように見えます。

役に立ちましたか?

解決

があります genericparameterattributes列挙 一般的なタイプの分散フラグを決定するために使用できること。

一般的なタイプを取得するには、使用してください 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;";
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top