[英]How to decide a Type is a custom struct?
對於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提供的結構),您可以幸運地排除具有以"System."
開頭的FullName的類型"System."
,或僅通過按裝配或命名空間過濾包含您感興趣的那些,或使用自定義屬性。
至少應該是
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);
有助於消除誤報(更安全嗎?),但它不那么便攜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.