如果C#LINQ具有自定义属性,则选择该属性

时间:2016-12-06 15:30:45

标签: c# linq dynamic reflection filter

我有一个StudentViewModel对象列表。我将此列表与DataGridView绑定,并根据绑定模型的属性将列生成设置为自动。

   public async Task LoadGridView()
    {
        Tuple<List<StudentViewModel>, int> result = await App.StudentService.SearchAsync(studentRequestModel);
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = result.Item1;
    }

在StudentViewModel中,我使用自定义属性IsViewable修饰了一些属性。

[AttributeUsage(AttributeTargets.Property)]
public class IsViewable: Attribute
{
    public bool Value { get; set; }
}

用法:

        [IsViewable(Value = true)]
        public string Name { get; set; }

想法是,在绑定UI控件之前,我想过滤列表并创建一个新的匿名对象列表,以便我的网格只填充选定的属性。

enter image description here

注意:我不想创建特定于网格的单独视图模型。如果它产生性能问题,我会重构它。

1 个答案:

答案 0 :(得分:1)

问题是,我序列化了动态列表,然后反序列化。然后我将该动态列表与datagridview绑定,它就像一个魅力。

enter image description here

整个项目可以在foyzulkarim/GenericComponents

找到

来电/使用:

        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;

enter image description here

enter image description here