所以我有一个可怕的设计类,我不能改变它有这样的属性:
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();
我在这里做错了吗?
答案 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)
答案 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但是使用反射的替代方法。