我要在对象列表(列表<(对象)>)中存储其他自定义对象。下面是我的List的结构。我的customobjects不继承自同一类
[
{
"id": "1",
"uniqueid": "secret",
"emailaddress": "123@gmail.com",
"stateCode": "Xyz",
},
{
"id": "2",
"Name": "secret",
"Age": "123@gmail.com",
},
]
我想根据id字段检查列表中是否存在对象。我想尝试反射,但是找不到在System.Object上执行反射的有用文章
答案 0 :(得分:2)
这并不理想,但是如果您必须将不相关的类型存储在同一列表中,则可以强制转换为dynamic
:
var results = list.Cast<dynamic>().Where( o => o.Id == 1 );
答案 1 :(得分:1)
首先,我同意这些评论。
这不是JSON结构的最佳设计/最佳用法。
在JSON数组中,您应该只具有相似类型的对象。这样,您将永远不会遇到这种情况。
解决问题的方法:
选项1:
在该json数组中,您可以使用newtonsoft API获取JObjects列表。
从JObject可以使用以下语法读取ID属性,假设类别是要搜索的JArray:
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方法中使用其他属性。
答案 2 :(得分:0)
使用此扩展方法ripped from this question:
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
}
}
您可能必须执行一些转换/拆箱操作才能获得相等的值,具体取决于属性的基础数据类型。正如其他人指出的那样,这是“魔术”和“模糊”的。您最好为对象使用抽象类或接口。此外,它还包含所有有趣的反射警告。