簡體   English   中英

如何在C#中獲取對象的所有簡單屬性

[英]How to get all simple properties of an object in C#

我想知道如何獲得所有類型的對象,而不是指向另一個類。

例如,這將包括string,int,datetime等,但不包括指向集合或其他自定義類的指針

我有以下內容,但它似乎沒有返回字符串:

PropertyInfo[] properties = typeOfObject.GetProperties();

foreach (PropertyInfo property in properties.Where(p => !p.PropertyType.IsClass))
{
}

正如Leri所要求的那樣 - 我計划采用一個對象的原始副本,沒有集合/類等。因此它必須包含所有原始類型,字符串,日期時間和其他任何存在的類型。

因為String是一個類,而不是像Int32Double等結構

如果你想要的不是一個類,而是包括字符串,那就指定一下!

foreach (PropertyInfo property in 
         properties.Where(p => !p.PropertyType.IsClass 
                                  || p.PropertyType == typeof(String)))
{
}

你的代碼也會給你所有的結構,它們本身可以包含對集合等的引用,所以它不會這樣做。

你最好的選擇可能是要求IsPrimitive(它給你int,short等),並添加你想要的任何其他已知類型,如string,DateTime等。

我決定在這里混合使用幾種解決方案。

首先,由於結構等問題,我決定保留Leri提到的允許類型列表。

其次,根據Luaan的評論,我已經寫了一個處理nullables的方法。

所以解決方案如下:

迭代屬性的代碼

foreach (PropertyInfo property in properties)
{
 if (this.IsTypeASimpleType(property.PropertyType) &&
     property.CanWrite)
 {
 }
}

然后是用於檢查類型是否正確的代碼

    private bool IsTypeASimpleType(Type typeToCheck)
    {
        var typeCode = Type.GetTypeCode(this.GetUnderlyingType(typeToCheck));

        switch (typeCode)
        {
            case TypeCode.Boolean:
            case TypeCode.Byte:
            case TypeCode.Char:
            case TypeCode.DateTime:
            case TypeCode.Decimal:
            case TypeCode.Double:
            case TypeCode.Int16:
            case TypeCode.Int32:
            case TypeCode.Int64:
            case TypeCode.SByte:
            case TypeCode.Single:
            case TypeCode.String:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
                return true;
            default:
                return false;
        }
    }

以及處理nullables的代碼

    private Type GetUnderlyingType(Type typeToCheck)
    {
        if (typeToCheck.IsGenericType &&
            typeToCheck.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            return Nullable.GetUnderlyingType(typeToCheck);
        }
        else
        {
            return typeToCheck;
        }
    }

現在,switch語句可能已被更改為允許類型的列表,但最終游戲將是相同的。

好的,有了你提煉的問題,更好的答案是:如果你能夠在一個變量上調用GetType(),那么它將返回一個對象,你可以反思該對象以獲得底層類型。 您還可以詢問該類型是否是某個其他現有類型的實例,這有助於確定運行時類型的安全性(“如果我將此實體視為Cat類型的對象,我的代碼會拋出異常嗎?”)

所以我認為你想要做的是調用GetType()。 然后,您可以使用返回的類型對象執行許多操作。 其中之一是測試完全匹配,例如這樣:“if(x.GetType()。Equals(typeof(int)))....

實際上有幾種方法可以做到並且所有這些方法都有效。 我剛剛做的完全匹配非常嚴格。 但請注意,您可以使用typeof(int)來獲取將成為int類型的真實基礎類型表示的Type對象,即使int是C#中的基類型,因此int類型的東西不是對象 - - 在運行時它由值表示,而不是由引用表示。 這是有效的,因為在編譯時解析了typeof()。

因此,我認為出於您的目的,這可能是您需要做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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