如何迭代数字命名的对象属性

时间:2011-01-16 14:37:12

标签: c# oop loops

所以我有一个可怕的设计类,我不能改变它有这样的属性:

object.Color1
object.Color2
object.Color3

等...

如何使用for循环遍历那些。换句话说,就像这样:

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

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

显然这段代码不起作用,但它让你知道我在追求什么。我必须对每个属性进行一些处理,我不想重复我的代码40次。 :)循环是完美的,我只是不确定如何动态创建属性的名称。

编辑:好的,所以我尝试了以下代码:

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 个答案:

答案 0 :(得分:4)

你正在寻找反思:

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

请注意,这会很慢 如果您多次执行此操作,则可以通过在数组中缓存Delegate.CreateDelegate(..., property.GetGetMethod())来加快速度。

答案 1 :(得分:2)

您可以使用反射:

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

答案 2 :(得分:0)

这就是我如何帮助寻找。

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

$object = (object) $abc;

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

答案 3 :(得分:0)

您可以使用反射按名称获取属性。在您的示例中,您可以使用:

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

为了获取名称为PropertyName的属性的值。您应检查pi!= null,因为如果请求的属性不存在,则返回null。 如果你写的函数是时间关键的,你应该注意反射有一些性能上的缺点。

答案 4 :(得分:0)

看看InvokeMethod ......

MSDN

Example at codeproject

答案 5 :(得分: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不变,您可以在构造对象时将信息添加到私有集合中。然后可以通过公共属性公开该集合以供您迭代。有点hacky但是使用反射的替代方法。