如何编写一个简单的方法,检查具体类型是否是自定义结构(使用public struct { };
创建)。
检查Type.IsValueType
是不够的,因为int
,long
等也是如此,
并向!IsPrimitiveType
添加支票不会排除decimal
,DateTime
以及其他一些值类型。我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构”
这些问题大致相同但没有我需要的答案:
编辑:从提到的答案中,“检查'系统'前缀”是最稳定的(虽然它仍然是一个黑客)。我最终决定创建一个你必须用它来装饰结构的属性,以便框架将它作为自定义结构来选择。 (我想的另一个选择是创建一个空接口,让struct实现那个空接口,但属性方式似乎更优雅)如果感兴趣的话,这是我原来的自定义结构检查器:
type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum
答案 0 :(得分:8)
框架中定义的结构与您自己定义的结构之间没有区别。
有几个想法可能是:
答案 1 :(得分:5)
嗯,DateTime,decimal等符合您的要求。就CLR而言,它们是自定义结构。一个hack,但你可以检查命名空间是否以“System”开头。
答案 2 :(得分:3)
public static class ReflectionExtensions {
public static bool IsCustomValueType(this Type type) {
return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System.");
}
}
应该有效
答案 3 :(得分:2)
您可以检查结构类型是否属于系统命名空间中的任何位置。但同样,这不是一个可靠的解决方案。
答案 4 :(得分:-1)
你有这种类型的价值吗?调用ToString
方法并检查返回的字符串是否以“{”开头。
如果没有值,请检查它是否具有无参数构造函数。如果没有,那就是构造函数。如果是,请使用Activator
创建实例并再次调用ToString
方法。