如何确定.NET Type是否是自定义结构?
如何编写一个简单的方法,检查具体类型是否是自定义结构(使用public struct { };
创建)。
检查Type.IsValueType
是不够的,因为它也适用于int
, long
等,并添加一个检查!IsPrimitiveType
不会排除decimal
, DateTime
和其他一些值类型。 我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构”
这些问题大致相同但没有我需要的答案:
- #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
方法。