Как перебирать свойства объекта с числовым именем - PullRequest
1 голос
/ 16 января 2011

Итак, у меня есть ужасно разработанный класс, который я не могу изменить, у которого есть такие свойства:

object.Color1
object.Color2
object.Color3

и т.д ...

Как я могу перебирать те, у которыхпетля.Другими словами, что-то вроде этого:

for (int i = 0; i <= 40; i++)
{
   string PropertyName = "Color" + i;

   if (object.PropertyName != "") 
   { 
       // do something
   }
}

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

EDIT : Хорошо, поэтому я попробовал следующий код:

for (int i = 1; i <= 20; i++ )
            {
                var type = pendingProduct.GetType();

                var colorProperty = type.GetProperty("Color" + i);
                string colorValue = colorProperty.GetValue(type, null).ToString();

                var colorSkuProperty = type.GetProperty("Color" + i + "SKU");
                string colorSkuValue = colorSkuProperty.GetValue(type, null).ToString();

                if (String.IsNullOrEmpty(colorValue)) continue;

                ProductColor color = new ProductColor {Color = colorValue, ProductSizes = productSizes};
                if (!String.IsNullOrEmpty(colorSkuValue)) color.SKU = colorSkuValue;
            }

Я получаю сообщение об ошибке «Объект не соответствует типу цели» в этой строке:

string colorValue = colorProperty.GetValue(type, null).ToString();

Я что-то здесь не так делаю?

Ответы [ 6 ]

4 голосов
/ 16 января 2011

Вы ищете отражение:

PropertyInfo property = typeof(SomeType).GetProperty("Color" + i);
string value = (string)property.GetValue(obj, null);

Обратите внимание, что это будет медленно.
Если вы делаете это много раз, вы можете сделать это быстрее, кэшируя Delegate.CreateDelegate(..., property.GetGetMethod()) в массиве.

2 голосов
/ 16 января 2011

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

var type = myObject.GetType();
var property = type.GetProperty("Color1");
var value = property.GetValue(myObject, null));
0 голосов
/ 16 января 2011

Вы можете попробовать что-то вроде ...

Type type = this.GetType();
PropertyInfo[] properties = type.GetProperties();

foreach (PropertyInfo p in properties)
{
    // Check property is the one you want
    // and carry out your code...
}

Кроме того, если у вас есть доступ к коду IE, вы можете изменить внутреннее устройство, но хотите оставить публичный API без изменений, вы можете просто добавитьинформация для частной коллекции, когда объект построен.Затем коллекция может быть открыта публичным свойством для повторения.Немного хакерский, но альтернатива использованию отражения.

0 голосов
/ 16 января 2011

Посмотрите на InvokeMethod ...

* MSDN 1004 *

Пример кода проекта

0 голосов
/ 16 января 2011

Вы можете использовать отражение, чтобы получить свойство по имени. В вашем примере вы можете использовать:

var pi = obj.GetType().GetProperty(PropertyName);
var val = pi.GetValue(obj,null);

Чтобы получить значение свойства, имя которого - PropertyName. Вы должны проверить для pi! = Null, потому что, если запрошенное свойство не существует, возвращается null. Если функция, которую вы пишете, критична по времени, вам все равно следует обратить внимание на то, что у отражения есть некоторые недостатки в производительности.

0 голосов
/ 16 января 2011

Вот как я могу помочь найти.

$abc = array(
 'a' => 'world',
 'b' => 'good',
);

$object = (object) $abc;

foreach($object as $k) 
{
  var_dump($object);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...