如何确定.NET Type是否是自定义结构?

如何编写一个简单的方法,检查具体类型是否是自定义结构(使用public struct { };创建)。

检查Type.IsValueType是不够的,因为它也适用于intlong等,并添加一个检查!IsPrimitiveType不会排除decimalDateTime和其他一些值类型。 我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构”

这些问题大致相同但没有我需要的答案:

  • #1
  • #2
  • #3

编辑:从提到的答案“检查’系统’前缀”是最稳定的(虽然它仍然是一个黑客)。 我最终决定创建一个必须用它来装饰结构的属性,以便框架将其作为自定义结构来选择。 (我想的另一个选择是创建一个空接口,让struct实现那个空接口,但属性方式似乎更优雅)

这是我原来的自定义结构检查器,如果有人感兴趣:

 type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum 

好吧,DateTime,decimal等符合您的要求。 就CLR而言,它们是自定义结构。 一个hack,但你可以检查命名空间是否以“System”开头。

框架中定义的结构与您自己定义的结构之间没有区别。

一些想法可能是:

  • 保留框架结构的白名单,并排除这些结构;
  • 识别定义类型的程序集(DLL),并保留框架程序集的白名单。
  • 确定类型所在的命名空间,并排除框架命名空间。

将上述注释放入扩展方法:

 public static class ReflectionExtensions { public static bool IsCustomValueType(this Type type) { return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System."); } } 

应该管用

您可以检查结构类型是否属于System命名空间内的任何位置。 但同样,这不是一个可靠的解决方案。

你有这种类型的价值吗? 调用ToString方法并检查返回的字符串是否以“{”开头。

如果没有值,请检查它是否具有无参数构造函数。 如果没有,那就是构造函数。 如果是,请使用Activator创建实例并再次调用ToString方法。