C# 如何确定类型是自定义结构?
对于C# 如何确定类型是自定义结构?,c#,struct,C#,Struct,对于类型,C#中有一个属性IsClass,但是如何确定类型是一个结构 虽然IsValueType是一个必要条件,但显然还不够。对于int也是一种值类型 有人建议使用以下代码: bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive; 但我不确定这是否是一个准确的方法。该公式应说明struct与其他类型(如DateTime、int和arrays)之间的区别 正如一些朋友指出的,这里
类型
,C#中有一个属性IsClass
,但是如何确定类型
是一个结构
虽然IsValueType
是一个必要条件,但显然还不够。对于int
也是一种值类型
有人建议使用以下代码:
bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive;
但我不确定这是否是一个准确的方法。该公式应说明struct与其他类型(如DateTime
、int
和array
s)之间的区别
正如一些朋友指出的,这里我指的是用户定义的结构,而不是预定义的类型,比如
DateTime
,从技术上讲,int也是一个结构。IsPrimitive只是检查该类型是否是CLR处理稍有不同的基元类型之一。您应该可以接受建议IsValueType&&!伊塞努姆&!iPrimitive
如果您只需要自定义结构(即BCL未提供的结构),您可能会幸运地排除以“”System.”
开头的全名的类型,或者通过按程序集或命名空间过滤,或者使用自定义属性,只包括您感兴趣的类型。至少应该是
bool isStruct = type.IsValueType && !type.IsEnum &&
!type.IsPrimitive && type != typeof(decimal);
你会很难受的。基本框架不知道框架其他部分中的所有预定义类型是什么。例如,期望核心框架了解
System.Drawing.Point
,是不合理的
OregonGhost可能是最好的:获取类型信息并检查FullName
属性,看看它是否以“System”开头。但您还需要检查“Microsoft.”
和“FSharp”
,以及其他可能的文件。只需在VisualStudio中单击“添加引用”,然后查看出现了哪些名称
然后你可能会冒阻塞太多的风险。微软通过NuGET包分发一些程序集,这些程序集中的类型通常有从<代码>“系统”> <代码>或“代码>”微软开始的名称。< /代码>您是否考虑那些“内置”类型,即使它们没有与框架一起分发?:
如果类型为{bool、byte、char、decimal、double、enum、float、int、long、sbyte、short、struct、uint、ulong、ushort},则IsValueType为true
说:
如果类型为{Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、UInt64、IntPtr、UIntPtr、Char、Double和Single},则IsPrimitive为true
对于IsStruct,您可以使用如下方法:
public static bool IsStruct(this Type type)
{
return type.IsValueType
&& !type.IsPrimitive
&& !type.IsEnum
&& type != typeof(decimal);
}
它对我有用
!X.PrimyType .ISSturyTeal&&X.PrimyType。IsClass 不是一个完美的解决方案,但您可以考虑在所要搜索的程序集中使用已知类型的搜索来缩小搜索范围:
System.Reflection.Assembly.GetAssembly(tyepof(OneOfMyTypes))
.GetExportedTypes()
.Where(t => t.IsValueType);
有助于消除误报(更安全?),但便携性较差。我不确定我是否理解这个问题。日期时间是一个结构。为什么要返回false呢?实际上int也是一种结构类型。语言规范声明“C#提供了一组预定义的结构类型,称为简单类型”。了解您为什么关心它会很有趣。你在做什么?可能有更好的方法来做你想做的事情。为什么我需要这个函数?我使用反射来显示数据。当我遇到一个用户结构时,我会显示它的字段。+1或“Microsoft.”
或“FSharp.”
或。我想他很难把它们全部消除。