繁体   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