2016-12-06 5 views
-1

У меня есть список объектов StudentViewModel. Я связываю этот список с DataGridView, а генерация столбца устанавливается на автоматический в соответствии с свойствами связанной модели.C# LINQ select property, если у него есть собственный атрибут

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; } 

Идея, как раз перед переплетом с Control UI, я хочу, чтобы отфильтровать список и сделать новый список анонимного объекта, чтобы моя сетка будет заполняться только выбранные свойства.

enter image description here

Примечание: Я не хочу, чтобы создать отдельные модели представлений, характерные для сеток. Я буду реорганизовать его, если он создаст проблемы с производительностью.

+2

Существует не способ динамически гена задайте анонимный тип, поскольку свойства должны быть известны во время компиляции. Вы можете использовать словарь для сопоставления имен и значений или заполнения «ExpandoObject» и использовать 'dynamic' для получения синтаксиса типа свойства. Либо это, либо создайте новые свойства 'o' и динамического копирования, которые имеют этот атрибут. –

+0

Этот ответ может помочь: https://stackoverflow.com/a/4938442/1220550 –

+1

Если я правильно понял, вы не хотите, чтобы эти свойства отображались 'DataGridView'. Если это то, что вы хотите, не можете ли вы достичь этого, используя атрибут '[Browsable (false)]' вместо вашего пользовательского 'IsViewable'? –

ответ

0

Уловка, я сериализовал динамический список, а затем десериализован. Затем я связываю этот динамический список с datagridview, и он работает как шарм.

enter image description here

Весь проект можно найти здесь foyzulkarim/GenericComponents

Caller/Использование:

 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

Смежные вопросы