簡體   English   中英

從列表中檢索值 <Objects> 不同的數據類型

[英]Retrieving Values from List<Objects> of different dataTypes

我在對象列表(列表<(對象)>)中存儲了不同的customobject。 下面是我的List的結構。我的customobjects不從同一個類繼承

[
      {
    "id": "1",
    "uniqueid": "secret",
    "emailaddress": "123@gmail.com", 
    "stateCode": "Xyz",
    },
    {
    "id": "2",
    "Name": "secret",
    "Age": "123@gmail.com",     
    },
]

我想根據id字段檢查列表中是否存在對象。我想嘗試反射,但是找不到在System.Object上執行反射的任何有用的文章

這不是理想的選擇,但是如果您必須將不相關的類型存儲在同一列表中,則可以強制轉換為dynamic

var results = list.Cast<dynamic>().Where( o => o.Id == 1 );

DotNetFiddle上的示例

首先,我同意這些意見。

這不是JSON結構的最佳設計/最佳用法。

在JSON數組中,您應該只具有相似類型的對象。 這樣,您將永遠不會遇到這種情況。

解決問題的方法:

選項1:

在該json數組中,您可以使用newtonsoft API獲得JObjects列表。

假設類別是您要搜索的JArray,則可以從JObject使用以下語法讀取ID屬性:

var list = categories.Select(c => (string)c["id"] == 1).ToList();

選項2:

您可以在只有ID屬性的簡單對象中反序列化整個集合。

例如

public interface IDummyInterface
{
    public string Id {get; set;}
}

public class SomeDummyClass : IDummyInterface

使用此偽類,您可以調用Deserialize方法來獲取所有對象,然后對其進行處理。 但是請記住,您將無法在選項2方法中使用其他屬性。

使用此問題中提取的擴展方法:

public static object GetPropValue(this object src, string propName)
{
     return src.GetType().GetProperty(propName).GetValue(src, null);
}

用法:

foreach(var o in Objects)
{
    if(o.GetPropValue("id") == someId)
    {
        // do something
    }
}

您可能必須進行一些轉換/拆箱操作才能獲得相等的值,具體取決於屬性的基礎數據類型。 正如其他人指出的那樣,這是“魔術”和“模糊”的。 您最好為對象使用抽象類或接口。 同時,還附帶了所有有趣的反射警告。

暫無
暫無

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

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