如何确定Type是一个自定义结构?

对于Type ,C#中有一个属性IsClass ,但如何判断Type是一个struct?

虽然IsValueType是必要条件,但显然还不够。 对于int也是值类型。

有人建议使用以下代码:

 bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive; 

但我不确定这是否是一种准确的方法。 该公式应该告诉struct和其他类型之间的区别,例如DateTimeintarray s。

正如一些朋友指出的那样,我指的是用户定义的结构而不是预定义的类型 ,例如DateTime

从技术上讲,int也是一个结构。 IsPrimitive只是检查类型是否是CLR处理的基本类型之一。 建议IsValueType && !IsEnum && !IsPrimitive你应该IsValueType && !IsEnum && !IsPrimitive

如果您只想要自定义结构(即那些不是由BCL提供的结构),您可以幸运地排除FullName以"System."开头的类型"System." ,或仅通过按assembly或命名空间过滤包含您感兴趣的那些,或使用自定义属性。

至少应该是

 bool isStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive && type != typeof(decimal); 

http://msdn.microsoft.com/en-us/library/bfft1t3c.aspx说:如果Type在{bool,byte,char,decimal,double,enum,float,int,long,sbyte,short中,则IsValueType为true ,struct,uint,ulong,ushort}。

http://msdn.microsoft.com/en-us/library/system.type.isprimitive%28v=vs.110%29.aspx说:如果Type在{Boolean,Byte,SByte,Int16,UInt16中,则IsPrimitive为真,Int32,UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single}。

比IsStruct你可以使用这样的方法:

 public static bool IsStruct(this Type type) { return type.IsValueType && !type.IsPrimitive && !type.IsEnum && type != typeof(decimal); } 

你将会遇到困难。 基础框架不知道框架的其他部分中的所有预定义类型是什么。 例如,期望核心框架了解System.Drawing.Point是不合理的。

OregonGhost可能是最好的答案 :获取类型信息并检查FullName属性以查看它是否以"System."开头"System." 。 但是你还需要检查"Microsoft.""FSharp" ,可能还有其他人。 只需在Visual Studio中单击“添加引用”,然后查看出现的名称。

然后你可能会冒很大的阻塞风险。 Microsoft通过NuGet包分发一些程序集,这些程序集中的类型通常具有以"System."开头的名称"System.""Microsoft." 您是否考虑过那些“内置”类型,即使它们没有随框架一起分发?

它对我有用!x.PropertyType.IsSecurityTransparent && x.PropertyType.IsClass

不是一个完美的解决方案,但您始终可以考虑在要搜索的程序集中按已知类型缩小搜索范围:

 System.Reflection.Assembly.GetAssembly(tyepof(OneOfMyTypes)) .GetExportedTypes() .Where(t => t.IsValueType); 

这有助于消除误报(更安全吗?),但它不那么便携。