【问题标题】:Find out if type is instantiable确定类型是否可实例化
【发布时间】:2011-07-31 02:46:29
【问题描述】:

在 C# 中,如何确定 Type 是否可以实例化?我试图避免 Activator.CreateInstance 异常。

我目前的方法是type.IsClass && !type.IsInterface,但我担心这可能会在抽象类等上失败。我也考虑过检查type.TypeInitializer == null,但我也不确定这是否万无一失。

找出Type 是否可实例化的最简单/最有效的方法是什么?

【问题讨论】:

  • 为了“安全”,他是否还必须检查 GetConstructor() 返回的 ConstructorInfo 对象的 IsPublic 和类似属性。我不知道。我在问..

标签: c# reflection interface types instantiation


【解决方案1】:

还有很多其他的陷阱。它可以有一个私有或受保护的构造函数。或者它可能没有默认构造函数,只有采用某些参数类型的构造函数。如果您不得不担心这一点,那么您肯定会在不应该使用 Activator.CreateInstance() 时使用它。随意构造对象只会造成破坏,你不知道它们可能会产生什么样的副作用。避免使用“FormatDisk”类。

你的朋友是个例外,它告诉你你的假设是错误的。永远不要故意阻止 .NET 框架发挥作用。

【讨论】:

  • 我正在创建接口实现的实例,所以我对它们有所了解。不过,我很欣赏这个警告。
  • 非常好,那么您不必担心异常或意外创建抽象类。一个简单的知名名称就可以完成工作。
  • 我将如何检查默认构造函数?
  • 此外,异常是好的,但优雅地处理它们也是如此。我宁愿检查“if (not null)”而不是“try-catch(null)”。
  • 接受“私有构造函数”和“非默认构造函数”示例。
【解决方案2】:

考虑IsAbstract。它将处理抽象类和静态类。您可能还想查看IsInterface

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2010-11-22
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多