首页 > 解决方案 > 反射:检查 Type 是否满足 new() 约束

问题描述

我有一个带有 new() 约束的通用函数:

public void DoMagicStuff<T>() where t:new() {
  // do something
}

我在每种类型的程序集的循环中调用此函数:

foreach (var type in baseType.Assembly.GetTypes())
{
   MethodInfo method = GetMethod<LiteDbQueue>(q => q.DoMagicStuff<object>());
   CallGenericMethod(this, method, baseType, type, null);
}

如果循环内的类型符合 new() 约束,则此循环可以正常工作。但是,如果该类型没有 new() 构造函数(例如静态类),我会收到一个错误

(Typename)',在 'Void DoMagicStuffT' 上违反了类型 'T' 的约束。

我想在循环中验证类型是否满足 new() - 约束。所以像:

if (type.IsNewable()) { ... }

如何才能做到这一点?


只是为了完成:以下方法用于为泛型方法“转换”我的类型。这些工作正常,并不是我的问题的一部分:

public MethodInfo GetMethod<T>(Expression<Action<T>> expr) {
   return ((MethodCallExpression)expr.Body).Method.GetGenericMethodDefinition();
}

public object CallGenericMethod(object baseObject, MethodInfo method, Type baseType, Type entityType, object[] parameters)
{
   MethodInfo genericMethod = method.MakeGenericMethod(entityType);
   var paams = genericMethod.GetParameters();
   var retVal = genericMethod.Invoke(baseObject, parameters);
   return retVal;
}

标签: c#genericsreflectionconstraints

解决方案


简而言之,

    public static bool HasDefaultConstructor<T>()
        => typeof (T).GetConstructor(Type.EmptyTypes) != null;

推荐阅读