2010-05-20 101 views
4

有沒有辦法在接口上反映檢測其泛型類型參數和返回類型的變化?換句話說,我可以使用反射來區分兩個接口:檢測接口泛型類型參數的方差

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


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

兩者的IL看起來相同。

回答

6

有一個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;"; 
    } 
}