インターフェイスの汎用型パラメーターの分散を検出します
-
03-10-2019 - |
質問
インターフェイスを反映して、その汎用型パラメーターとリターンタイプの分散を検出する方法はありますか?言い換えれば、反射を使用して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;";
}
}
所属していません StackOverflow