2011-01-16 4 views
1

Так что я ужасно разработанный класс, который я не могу изменить, что имеет такие свойства, как это:Как перебрать численно именованные свойства объекта

object.Color1 
object.Color2 
object.Color3 

и т.д ...

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

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(); 

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

+1

Вам нужно получить значение экземпляра объекта, а не экземпляр 'System.Type'. – SLaks

ответ

4

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

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

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

0

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

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

$object = (object) $abc; 

foreach($object as $k) 
{ 
    var_dump($object); 
} 
+2

** C# **. – SLaks

+1

php? на вопросе есть тег C# :) – Bazzz

0

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

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

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

2

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

var type = myObject.GetType(); 
var property = type.GetProperty("Color1"); 
var value = property.GetValue(myObject, null)); 
0

Вы могли бы попробовать что-то вдоль линий .. .

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

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

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