c# - 反射:检查 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;
}
解决方案
简而言之,
public static bool HasDefaultConstructor<T>()
=> typeof (T).GetConstructor(Type.EmptyTypes) != null;
推荐阅读
- macos - “TestCafe 浏览器工具”想要访问“Google Chrome”。Mac 安全弹出问题。Mac中是否有始终允许的设置?
- javascript - 如何在 React Web 应用程序(非原生)中拍照
- python - 使用 Python 烧瓶为 IOT 应用程序创建通知系统
- javascript - 强制网页加载到页面顶部
- php - 如何通过表中的 id(1-3) 等特定 id 范围从数据库中获取数据?
- swift - 在 Swift 4 中退出 Firebase
- c - 将 16 位正数转换为二进制的程序
- reactjs - 只是为了一劳永逸,您究竟如何更新工作存储库中的 npm 包?
- sql - 如何使用 JPQL 查询存储为 BINARY(16) 的 UUID
- db2 - DB2:是否可以从应用程序禁止密码和使用可信连接连接到 DB2