2016-05-03 2 views
0

У меня есть два класса:C# - Отражение - Получить уместность массива во всех индексах

public class Car 
{ 
    public string color { get; set; } 
    public string model { get; set; } 
} 

public class myclass 
{ 
    public Car[] car { get; set; } 
} 

и один пример:

myclass c = new myclass() 
{ 
    car = new Car[] 
    { 
     new Car() 
     { 
      color = "blue", 
      model = "my model" 
     }, 
     new Car() 
     { 
      color = "green", 
      model = "my model 2" 
     } 
    } 
}; 

var car = c.GetType().GetProperty("car").GetValue(c, null); 

вар автомобиль =:

var car

Как я могу перебрать все индексы массива car и получить свойство color?

ответ

1

Еще один общий способ попробует преобразовать его в IEnumerable, чтобы ваша коллекция не привязывалась только к массиву.

var cars = c.GetType().GetProperty("car").GetValue(c) as IEnumerable<object>; 
foreach (var car in cars) 
{ 
    Console.WriteLine(car.GetType().GetProperty("color").GetValue(car)); 
} 
1

Если вам нужно использовать отражение, чтобы сделать зацикливание, вы могли бы попробовать что-то вроде этого:

//gets the value of myclass's car property--an array of type Car[] returned as an object 
var cars = c.GetType().GetProperty("car").GetValue(c, null); 

if (cars.GetType().IsArray)//should be true for you 
{ 
    //gets the type of the elements of the array: Car 
    var carArrayElementType = cars.GetType().GetElementType(); 

    //gets the color property of Car 
    var colorProp = carArrayElementType.GetProperty("color"); 

    //lets you loop through the cars array 
    var carEnumerable = cars as IEnumerable; 

    foreach (var car in carEnumerable) 
    { 
     //returns the color property's value as a string 
     var color = colorProp.GetValue(car, null) as string; 

     //use color 
    } 
} 

Это говорит, тем более прямой способ цикла по всем индексам массива car и получить свойство color без использования отражения будет что-то вроде:

foreach(var car in c.car) 
{ 
    var color = car.color; 

    //use color 
} 
+0

спасибо, но я не знаю тип автомобиля. Как использовать динамический тип для автомобиля? –

+0

О! Я обновил свой ответ - это то, что вы искали? – AGB

0

не уверен, что именно вы спрашиваете, судя по нему это не имеет ничего общего с отражением ... Если вы просто хотите перебрать все автомобили в c.car вы можете использовать foreach или for loop.

foreach (Car car in c.car) 
{ Console.Writeline(car.color); } 

for (int i = 0; i < c.car.length; ++i) 
{ Console.Writeline(c.car[i].color); } 

По внешнему виду, однако, вы не поняли основы программирования и свойства C#. Я предлагаю вам найти codestyle и придерживаться его, как правило, я бы рекомендовал UpperCamelCase для свойств и классов. Вы должны посмотреть на microsofts documentation on properties

0

Я считаю, что вам нужно просто передать возвращенный объект из GetValue в массив Car [], а затем просто обойти его.

var cars = c.GetType().GetProperty("car").GetValue(c, null) as Car[]; 

foreach (Car c in cars) 
{ 
    Debug.WriteLine("the color is " + c.color.ToString()); 
}