我有一个带有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;
}
答案 0 :(得分:1)
简而言之,
public static bool HasDefaultConstructor<T>()
=> typeof (T).GetConstructor(Type.EmptyTypes) != null;