簡體   English   中英

如何確定Type是一個自定義結構?

[英]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和其他類型之間的區別,比如DateTimeintarray 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM