c# - 事先检查 `System.Activator.CreateInstance(Of T)` 是否会失败

标签 c# .net vb.net

我有一个类型(人类),我想知道我是否可以执行 System.Activator.CreateInstance(Of Human)()。所以基本上我想检查 Human 是否有一个公共(public)无参数构造函数/或一个带有可选参数的公共(public)构造函数,从而可以在不提供任何参数的情况下调用 New Human

是否可以预先检查 System.Activator.CreateInstance(Of T) 是否会失败? (我的意思是除了在 Try Catch 中包装语句 System.Activator.CreateInstance(Of Human)() 当然..)

我已经试过了,但它不起作用:

Option Strict On : Option Explicit On
Module Test
    Public Class Human
        Public Sub New(Optional ByVal a As Integer = 1)

        End Sub
    End Class
    Public Sub Main()
        Dim c = GetType(Human).GetConstructor(System.Type.EmptyTypes)
        MsgBox(c Is Nothing)
    End Sub
End Module

最佳答案

检查构造函数是否为空或所有参数都是可选的:

var hasEmptyOrDefaultConstr = 
  typeof(Human).GetConstructor(Type.EmptyTypes) != null || 
  typeof(Human).GetConstructors(BindingFlags.Instance | BindingFlags.Public)
    .Any (x => x.GetParameters().All (p => p.IsOptional));

关于c# - 事先检查 `System.Activator.CreateInstance(Of T)` 是否会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6113970/

相关文章:

asp.net - 用户在ASP.NET应用程序中使用Entity Framework 4和VB.NET更新记录时设置值

c# - 如何使用 Open XML SDK for Office 创建 MS WORD 加载项功能区

c# - 将 Expression<Func<t, bool>> 转换为 Expression<Func<x, bool>>

c# - 按类型查找 WPF 窗口中的所有控件

c# - .net 客户端将 soap 故障解析为协议(protocol)异常

vb.net - 如何按文件名和编号排序文件列表?

vb.net - 使用 .NET 将二进制转换器转换为十进制

c# - LINQ to SQL多对多关系Insert和Delete问题

c# - 具有一些并行操作和一些顺序操作的方法的任务并行库

.net - 如何断开 TcpClient 以允许新连接?