如何同时迭代两个重要的类对象以检查它们的属性?
这些post1 post2讨论如何使用通用默认数据结构来做到这一点,但是如果它是一个自定义类并且我无法修改它,例如,类似
public class A
{
public int propA { get; set; }
public int propB { get; set; }
...
}
它也没有 GetEnumerator()
方法。如何在使用反射时执行类似于 Python zip 的操作?所以我可以做这样的事情:
foreach(var pair in zip(myClassObj1.GetType().GetProperties(), myClasObj2.GetType().GetProperties())
{
var name1 = pair.Item1.Name;
var name2 = pair.Item2.Name;
var value1 = pair.Item1.GetValue(myClassObj1, null);
var value2 = pair.Item2.GetValue(myClassObj2, null);
// do things
}
最佳答案
您需要为此使用反射(System.Reflection
)。首先,您需要获取要从中获取所有属性的对象的Type对象。然后,调用方法 GetProperties(),该方法将返回 PropertyInfo 对象数组。然后运行所有对象来收集您需要的信息。
public static IDictionary<string, object> GetAllProperties(object obj)
{
var toret = new Dictionary<string, object>();
Type objType = obj.GetType();
PropertyInfo[] properties = objType.GetProperties();
foreach(PropertyInfo pinfo in properties) {
toret.Add( pinfo.Name, pinfo.GetValue( obj ) );
}
return toret;
}
例如,对于像这样的对象:
class Foo {
public int A { get; set; }
public int B { get; set; }
}
您可以通过以下方式显示给定对象的属性名称和值:
class Ppal {
public static void Main()
{
var foo = new Foo{ A = 5, B = 6 };
foreach(KeyValuePair<string, object> pair in GetAllProperties( foo ) ) {
Console.WriteLine( "Foo.{0} = {1}", pair.Key, pair.Value );
}
}
}
希望这有帮助。
关于c# - 如何在 C# 中同时迭代两个非平凡类对象的属性,类似于 Python 的 zip 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53562210/