Как я могу хранить все свойства класса в массиве объектов? - PullRequest
1 голос
/ 26 марта 2010

Допустим, у меня есть класс myClass , который имеет несколько свойств, таких как property1 , property2, perperty3, и т. Д. заполнить массив каждым из этих свойств, чтобы я мог получить доступ к каждому из них через его индекс. Есть ли автоматический способ сделать это?

Вот пример из SportsStore (Pro ASPN.NET MVC / Steve Sanderson / Apress) о том, как собрать все активные контроллеры в «Assembly».

 var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
 where typeof(IController).IsAssignableFrom(t) 
 select t; 

 foreach(Type t in controllerTypes)
    //Do something

Интересно, есть ли какая-то вещь, подобная той, что приведена выше, которую я могу использовать для сбора (только) свойств класса и сохранения их в массиве, независимо от значения каждого из них (int, string или custom type)

Надеюсь, я смог ясно выразить себя. В противном случае я могу изменить текст.

Спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 26 марта 2010

Вы можете использовать отражение:

var foo = new
{
    Prop1 = "prop1",
    Prop2 = 1,
    Prop3 = DateTime.Now
};

var properties = TypeDescriptor.GetProperties(foo.GetType());
var list = new ArrayList();
foreach (PropertyDescriptor property in properties)
{
    var value = property.GetValue(foo);
    list.Add(value);
}

и версия LINQ, которая выглядит лучше:

var list = TypeDescriptor
    .GetProperties(foo.GetType())
    .Cast<PropertyDescriptor>()
    .Select(x => x.GetValue(foo))
    .ToArray();
0 голосов
/ 26 марта 2010

Я получил это от здесь :

foreach(Type t in controllerTypes)
{
  foreach (MemberInfo mi in t.GetMembers() )
  {
    if (mi.MemberType==MemberTypes.Property)
    {
      // If the member is a property, display information about the property's accessor methods
      foreach ( MethodInfo am in ((PropertyInfo) mi).GetAccessors() )
      {
        // do something with [am]
      }
    }
  }
}
0 голосов
/ 26 марта 2010

поможет ли метод Type.GetProperties () ?

...