4
有沒有辦法在接口上反映檢測其泛型類型參數和返回類型的變化?換句話說,我可以使用反射來區分兩個接口:檢測接口泛型類型參數的方差
interface IVariant<out R, in A>
{
R DoSomething(A arg);
}
interface IInvariant<R, A>
{
R DoSomething(A arg);
}
兩者的IL看起來相同。
有沒有辦法在接口上反映檢測其泛型類型參數和返回類型的變化?換句話說,我可以使用反射來區分兩個接口:檢測接口泛型類型參數的方差
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;";
}
}