如何确定Type是一个自定义结构?
对于Type
,C#中有一个属性IsClass
,但如何判断Type
是一个struct?
虽然IsValueType
是必要条件,但显然还不够。 对于int
也是值类型。
有人建议使用以下代码:
bool IsStruct = type.IsValueType && !type.IsEnum && !type.IsPrimitive;
但我不确定这是否是一种准确的方法。 该公式应该告诉struct和其他类型之间的区别,例如DateTime
, int
和array
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);
https://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}。
https://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);
这有助于消除误报(更安全吗?),但它不那么便携。
上述就是C#学习教程:如何确定Type是一个自定义结构?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/942599.html