假设我有两种通用方法:
static void Foo<T>(T argument) { }
static void Bar<T>(T argument) { }
以下代码返回 false ,因为这两个T
属于不同的类型,它们可能有不同的约束:
var flags = BindingFlags.Static | BindingFlags.NonPublic;
var foo = typeof (Program).GetMethod("Foo", flags)bar.GetParameters()[0];
var bar = typeof(Program).GetMethod("Bar", flags)foo.GetParameters()[0];
bool test = foo.ParameterType == bar.ParameterType; // false
我想编写一个方法,根据它们的约束比较两个T
,如果它们具有相同的约束,则返回 true 。例如,上述结果应为true,因为两个参数都是没有任何约束。
我可以使用GetGenericParameterConstraints
方法并比较类型,但我还要对class
,struct
和new()
约束进行检查。有没有办法使用Reflection
?
答案 0 :(得分:3)
查看foo.ParameterType
和bar.ParameterType
个实例的GenericParameterAttributes
属性:它返回一个枚举,其中包含您类型的所有可能属性。
您有兴趣:
ReferenceTypeConstraint
(如果您添加class
作为约束)NotNullableValueTypeConstraint
(如果您添加struct
作为约束)DefaultConstructorConstraint
(如果未与NotNullableValueTypeConstraint
合并,则添加了new()
作为约束)答案 1 :(得分:0)
如果参数顺序很重要,您可以使用此方法:
private static bool CompareGenerics(MethodInfo m1, MethodInfo m2)
{
var args1 = m1.GetGenericArguments();
var args2 = m2.GetGenericArguments();
if (args1.Length != args2.Length)
return false;
for (int i = 0; i < args1.Length; i++)
{
if ((args1[i].GenericParameterAttributes ^ args2[i].GenericParameterAttributes) != 0)
return false;
}
return true;
}