C#LINQ select属性(如果它具有自定义属性)
我有一个C#LINQ select属性(如果它具有自定义属性),c#,linq,dynamic,reflection,filter,C#,Linq,Dynamic,Reflection,Filter,我有一个StudentViewModel对象列表。我正在用DataGridView绑定此列表,并且根据绑定模型的属性将列生成设置为自动 public async Task LoadGridView() { Tuple<List<StudentViewModel>, int> result = await App.StudentService.SearchAsync(studentRequestModel); dataGridV
StudentViewModel
对象列表。我正在用DataGridView绑定此列表,并且根据绑定模型的属性将列生成设置为自动
public async Task LoadGridView()
{
Tuple<List<StudentViewModel>, int> result = await App.StudentService.SearchAsync(studentRequestModel);
dataGridView1.DataSource = null;
dataGridView1.DataSource = result.Item1;
}
用法:
[IsViewable(Value = true)]
public string Name { get; set; }
想法是,在绑定UI控件之前,我想过滤列表并创建一个新的匿名对象列表,这样我的网格将只填充选定的属性。
注意:我不想创建特定于轴网的单独视图模型。如果它产生性能问题,我将重构它 问题是,我序列化了动态列表,然后反序列化。然后我将动态列表与datagridview绑定,它就像一个符咒 整个项目可以在这里找到 来电者/用法:
Type type = typeof(StudentViewModel);
PropertyInfo[] properties = type.GetProperties();
var infos = properties.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(IsViewable))).ToList();
List<StudentViewModel> models = result.Item1;
List<dynamic> list = models.Select(x => GetValue(x, infos)).ToList();
string serializeObject = JsonConvert.SerializeObject(list);
var deserializeObject = JsonConvert.DeserializeObject<List<dynamic>>(serializeObject);
dataGridView1.DataSource = deserializeObject;
Type Type=typeof(StudentViewModel);
PropertyInfo[]properties=type.GetProperties();
var infos=properties.Where(x=>x.CustomAttributes.Any(y=>y.AttributeType==typeof(isview)).ToList();
列表模型=result.Item1;
List=models.Select(x=>GetValue(x,infos)).ToList();
string serializeObject=JsonConvert.serializeObject(列表);
var deserializeObject=JsonConvert.deserializeObject(serializeObject);
dataGridView1.DataSource=反序列化对象;
没有一种方法可以动态生成匿名类型,因为需要在编译时知道属性。您可以使用字典映射名称和值,或者填充
ExpandoObject
,并使用dynamic
获取类似属性的语法。或者创建一个新的o
并动态复制具有该属性的属性。这个答案可能会有帮助:如果我理解正确,您不希望这些属性显示在DataGridView
中。如果这是您想要的,您是否可以使用属性[Browsable(false)]
而不是自定义的isview
?您还可以更改与这些属性对应的GridView列的可见性。@DStanley如果我错了,请纠正我,但您是否建议触摸GridView?对这可能是一种选择。但是假设我想要构建一个用户控件,并且我有很多视图模型,那么我就不能手动完成。
Type type = typeof(StudentViewModel);
PropertyInfo[] properties = type.GetProperties();
var infos = properties.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(IsViewable))).ToList();
List<StudentViewModel> models = result.Item1;
List<dynamic> list = models.Select(x => GetValue(x, infos)).ToList();
string serializeObject = JsonConvert.SerializeObject(list);
var deserializeObject = JsonConvert.DeserializeObject<List<dynamic>>(serializeObject);
dataGridView1.DataSource = deserializeObject;