Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#LINQ select属性(如果它具有自定义属性)_C#_Linq_Dynamic_Reflection_Filter - Fatal编程技术网

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;