Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定.NET类型是否为自定义结构?_C#_.net_Reflection_Struct_Types - Fatal编程技术网

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阿特格里尔:顺便说一句,我想不起来了:)谢谢