如何通过反射获得诸如`new()`约束。 ()

时间:2017-04-29 16:08:03

标签: c#

e.g:

泛型参数T可以包含许多约束:

public Class<T> where T : class, IDisponse, new()
{
}

如何通过反射得到T的所有约束?

我已经知道了:

var t = typeof(Class<>).GetGenericArguments()[0]
t.IsValueType // should be struct?
t.GetGenericParameterConstraints() // should be IDisponse or other type?

但如何获得其他限制:

  • 新()

2 个答案:

答案 0 :(得分:1)

您可以使用Type.GenericParameterAttributes属性:

  

获取描述的GenericParameterAttributes标志的组合   当前泛型类型的协方差和特殊约束   参数。

即。它返回通用参数约束的按位掩码。例如。如果你想检查是否有new()约束:

var attributes = t.GenericParameterAttributes;
if ((attributes & GenericParameterAttributes.DefaultConstructorConstraint) != 0)
  //....

对于class约束验证,您应该检查ReferenceTypeConstraint标志。

答案 1 :(得分:-3)

您是否正在尝试通过反射创建新实例?

使用System.Activator类。

https://msdn.microsoft.com/en-us/library/system.activator(v=vs.110).aspx

T instance = (T)Activator.CreateInstance(typeof(T));