Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何迭代使用数字命名的对象属性_C#_Oop_Loops - Fatal编程技术网

C# 如何迭代使用数字命名的对象属性

C# 如何迭代使用数字命名的对象属性,c#,oop,loops,C#,Oop,Loops,所以我有一个设计糟糕的类,我无法更改它的属性如下: object.Color1 object.Color2 object.Color3 for (int i = 0; i <= 40; i++) { string PropertyName = "Color" + i; if (object.PropertyName != "") { // do something } } 等等 如何使用for循环遍历这些对象。换句话说,类似这样的事情: ob

所以我有一个设计糟糕的类,我无法更改它的属性如下:

object.Color1
object.Color2
object.Color3
for (int i = 0; i <= 40; i++)
{
   string PropertyName = "Color" + i;

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

如何使用for循环遍历这些对象。换句话说,类似这样的事情:

object.Color1
object.Color2
object.Color3
for (int i = 0; i <= 40; i++)
{
   string PropertyName = "Color" + i;

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

我在这里做错什么了吗?

你在寻找反思:

PropertyInfo property = typeof(SomeType).GetProperty("Color" + i);
string value = (string)property.GetValue(obj, null);
请注意,这将是缓慢的。
如果您多次这样做,可以通过在数组中缓存Delegate.CreateDelegate…,property.getMethod来加快速度。

您正在寻找反射:

PropertyInfo property = typeof(SomeType).GetProperty("Color" + i);
string value = (string)property.GetValue(obj, null);
请注意,这将是缓慢的。
如果您多次这样做,可以通过在数组中缓存Delegate.CreateDelegate…,property.getMethod来加快速度。

这是我帮助查找的方法

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

$object = (object) $abc;

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

这就是我如何帮助寻找的方法

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

$object = (object) $abc;

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

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

var pi = obj.GetType().GetProperty(PropertyName);
var val = pi.GetValue(obj,null);
以获取名为PropertyName的属性的值。你应该检查pi!=null,因为如果请求的属性不存在,则返回null。
如果您正在编写的函数是时间关键型的,那么无论如何都应该注意反射有一些性能缺陷。

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

var pi = obj.GetType().GetProperty(PropertyName);
var val = pi.GetValue(obj,null);
以获取名为PropertyName的属性的值。你应该检查pi!=null,因为如果请求的属性不存在,则返回null。
如果您正在编写的函数是时间关键型的,那么无论如何您都应该注意反射有一些性能缺陷。

看看InvokeMethod


看看InvokeMethod


您可以使用反射:

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

您可以使用反射:

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

你可以尝试一些类似于

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

此外,如果您可以访问代码,也就是说,您可以更改内部结构,但希望保持公共API不变,那么您可以在构建对象时将信息添加到私有集合中。然后,该集合可以由公共属性公开,供您迭代。有点老套,但这是使用反射的另一种选择。

您可以尝试以下方法

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

此外,如果您可以访问代码,也就是说,您可以更改内部结构,但希望保持公共API不变,那么您可以在构建对象时将信息添加到私有集合中。然后,该集合可以由公共属性公开,供您迭代。有点老套,但可以替代使用反射。

php?问题上有一个C标记:php?问题上有一个C标记:您需要获取对象实例的值,而不是System.Type实例。您需要获取对象实例的值,而不是System.Type实例。