C# 如何确定.NET类型是否为自定义结构?
如何编写一个简单的方法,用于检查具体类型是否为自定义结构(使用C# 如何确定.NET类型是否为自定义结构?,c#,.net,reflection,struct,types,C#,.net,Reflection,Struct,Types,如何编写一个简单的方法,用于检查具体类型是否为自定义结构(使用公共结构{};创建) 检查Type.IsValueType是不够的,因为它也适用于int,long,等等, 并将支票添加到!IsPrimitiveType不会排除十进制、日期时间以及其他一些值类型。我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构” 这些问题基本相同,但没有我需要的答案: 编辑:从提到的答案来看,“检查‘系统’前缀”是最稳定的(尽管它仍然是一种黑客行为)。最后,我决定创建一个属性,您必须使用该
公共结构{};
创建)
检查Type.IsValueType
是不够的,因为它也适用于int
,long
,等等,
并将支票添加到!IsPrimitiveType
不会排除十进制
、日期时间
以及其他一些值类型。我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构”
这些问题基本相同,但没有我需要的答案:
type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum
日期时间、小数等符合您的要求。就CLR而言,它们是自定义结构。这是一个黑客攻击,但是您可以检查名称空间是否以“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.");
}
}
应该工作您有与该类型匹配的值吗?调用
ToString
方法并检查返回的字符串是否以“{”开头
如果没有值,请检查它是否有无参数构造函数。如果没有,则它是一个构造函数。如果有,请使用
Activator
创建一个实例,然后再次调用ToString
方法。出于好奇,为什么要检测此问题?Fluent NHibernate+自动映射:设置所有自定义结构o作为组件(值对象)处理;将任何其他值类型设置为组件(如DateTime或decimal)将在使用Fluent NHibernate(一个“众所周知”的白名单)的注释上下文中使整个框架崩溃(至少在mono下是这样)结构将是最好的方法。列表足够短,易于理解,并且可能永远不会更改。同意,当您发现每一个导致崩溃的列表时,将其添加到白名单(或黑名单或任何您称之为的列表)中,然后继续。框架没有太多的结构。是的,但不幸的是,没有这个列表。如果你错过了什么,以后再使用这个结构,你将不知道框架为什么会崩溃。当然,你自己的名称空间可以从系统开始…:)没有人会这样做,对吗?是的,这就是为什么我称之为hack。@M阿特格里尔:顺便说一句,我想不起来了:)谢谢