反思:检查Type是否满足new()约束

时间:2019-06-03 11:49:57

标签: c# generics reflection constraints

我有一个带有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'的约束。

我想在循环内验证Type是否满足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;
}

1 个答案:

答案 0 :(得分:1)

简而言之,

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