Получить свойства элемента списка - PullRequest
1 голос
/ 24 мая 2011

Лес говорит, что у меня есть класс:

class SomeObject
{
  public string Name{get;set;}
  public string SomeProperty {get; set;}
}

У меня также есть список объектов SomeObjects:

List<SomeObject> list1 = new List<SomeObject>();
list1.Add(new SomeObject{ Name="Jhon", SomeProperty="baa bla bla"});
list1.Add(new SomeObject{ Name="Albert", SomeProperty="some description"});
list1.Add(new SomeObject{ Name="Tom", SomeProperty="some text"});

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

class MyListView
{
    //Constructor
    public MyListView(System.Windows.Controls.ListView listView, object list)
    {
          Lista = ((IEnumerable)list).Cast<object>().ToList(); // Cast the object list to List<objects>

          var properties = Lista[0].GetType().GetProperties();

          foreach (var prop in properties)
          {
              // prop = Name then SomeProperty in this case
              // create new column in listView
              // etc
          }

    }
}

Единственная проблема заключается в том, что если передать список без объектов, я не знаю, как я могу получить свойства SomeObject, потому что мой конструктор предполагает, что список не пуст, поэтому, получая первый объект, он может увидеть свойства.

Итак, мой вопрос, как я могу получить свойства Name и SomeProperty, посмотрев на список. Я хочу сделать что-то вроде:

public MyListView(System.Windows.Controls.ListView listView, object list)
{
   Lista = ((IEnumerable)list).Cast<object>().ToList(); // Cast the object list to List<objects>
   properties = Lista.GetType().GetProperty("some property that refers to list items").GetType().GetProperties();

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

Ответы [ 4 ]

4 голосов
/ 24 мая 2011

Если вы предполагаете, что list будет IEnumerable «чего-то», почему бы не пойти дальше и указать это с помощью параметра типа. Затем вы можете получить тип, даже если список окажется нулевым или пустым:

public class MyListView<T>{
    //Constructor
    public MyListView(System.Windows.Controls.ListView listView, IEnumerable<T> list)
    {
          var properties = typeof(T).GetProperties();

          foreach (var prop in properties)
          {
              // prop = Name then SomeProperty in this case
              // create new column in listView
              // etc
          }
    }
}

// Example usage: Inferred type parameter 
List<SomeObject> list = null;
var yourListView = new MyListView(listView1, list);

// Example usage: Explicitly specify the type parameter if it can't be inferred
var yourListView = new MyListView<SomeObject>(listView1, null);
1 голос
/ 24 мая 2011

Когда вы вызываете конструктор MyListView, знаете ли вы тип класса SomeObject? Если это так, вы можете использовать дженерики

0 голосов
/ 24 мая 2011

взято с http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx:

        Type d1 = typeof(List<int>);
        Type[] typeParameters = d1.GetGenericArguments();

В этом случае typeParametes [0] содержит тип System.Int32.

Надеюсь, это поможет.

0 голосов
/ 24 мая 2011

Вы захотите сделать что-то подобное.

if(list.Count>0)
{
    var firstItem = list[0];
    var type = response.GetType();

    PropertyInfo nameInfo = type.GetProperty("Name");
    nameInfo.GetValue(firstItem, null);                 //returns list[0].Name
    nameInfo.SetValue(firstItem, "somevalue", null); ;  //sets list[0].Name to "somevalue"

    PropertyInfo someInfo = type.GetProperty("SomeProperty");
    someInfo.GetValue(firstItem, null);                 //returns list[0].SomeProperty
    someInfo.SetValue(firstItem, "somevalue", null); ;  //sets list[0].SomeProperty to "somevalue"
}

Блок if гарантирует, что вы не пытаетесь отразить нулевой объект. Тогда мы получаем Type и PropertyInfo оттуда. PropertyInfo позволяет получить доступ к метаданным для свойства, а также получить или установить значение. Я использовал "somevalue" в установщиках, но он может принимать любой тип. Последний параметр - если ваше свойство проиндексировано, но вы не указали, что это так null будет работать нормально.

Это прекрасно работает для первого объекта в списке. Если вам нужно отразить весь список, вам нужно будет настроить это в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...