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

Szt*_*upY 7 .net c# reflection struct types

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

检查Type.IsValueType是不够的,因为这也是千真万确的int,long等,并增加了检查,!IsPrimitiveType将不排除decimal,DateTime也许有些其他值类型.我知道大多数内置值类型实际上是"结构",但我只想检查"自定义结构"

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

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

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

type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum
Run Code Online (Sandbox Code Playgroud)

stu*_*ith 8

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

一些想法可能是:

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


Mat*_*eer 5

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

  • 是的,这就是我称之为黑客的原因. (2认同)