在 Linq 查询中,如果我想选择除特定属性之外的所有属性,我该怎么办?
我不能使用
Select()
并指定除我不想要的属性之外的所有属性,因为我不知道其中一些属性(我查询抽象类的列表)。
我也不能只选择所有属性,因为这会在序列化 X 类型的对象时检测到循环引用。(我正在将对象序列化为 Json)
我可以使用任何
Filter()
方法或扩展方法吗?
谢谢。
不,你不能那样做——根本没有那样的事情。请记住,作为投影的结果,您必须最终得到特定类型...如果您不知道要选择什么属性,怎么能拥有这样的类型?
如果您正在查询某个抽象类的列表,是否有任何理由不想只保留对该抽象类实例的引用?将其分成特定的属性有什么好处?或者您是否“真的”试图避免稍后看到这些属性,例如用于数据绑定?
...然后我想到了两个选项:
使用脚本为您生成代码 - 可能通过使用反射来打印类属性列表并将其 C&Ping 到您的代码中。在实时代码中使用反射,使用
PropertyInfo 类
并按PropertyInfo.Name
如果您确实使用第一个,可能希望将代码保留在单独的帮助程序类中。没有人希望大量的属性选择行扰乱一个重要的方法。
那么,您到底想要实现什么目标?如果你想在序列化之前解决循环问题,为什么不在序列化之前遍历对象模型,并将所有反向引用设置为空呢?
public class MyClass{
public List<MyClass> Children {get;set;}
public MyClass Parent {get;set;}
public void ClearParents(){
this.Parent = null;
this.Children.ForEach(e => e.ClearParents());
}
}
这个问题的更新的
2024版本可以这样解决;
(我正在将对象序列化为 Json)
首先我们用json定义一个模型
NullValueHandling
例如;
[JsonProperty("intProp", NullValueHandling = NullValueHandling.Ignore)] public int? IntProp { get; set; } // it can be any prop with nullable [JsonProperty("stringProp", NullValueHandling = NullValueHandling.Ignore)] public string? StringProp { get; set; } // I said, it can be any prop with nullable [JsonProperty("objectProp", NullValueHandling = NullValueHandling.Ignore)] public SomeObject? ObjectProp { get; set; } // ...any prop with nu... nwm u got the idea...
然后我们得到引用的值,并通过无效删除我们不需要的值;
var test = test.Select(x => { x.ObjectProp = null; return x; }).ToList();
// see the trick here? re-object the object with a prop nullified..
然后如果你用json序列化,最终结果将是除了我们不需要的字段之外的所有字段..
return JsonConvert.SerializeObject(test);
此方法可以通过以下方式实现;
using Newtonsoft.Json;