c# - 如何在 C# 中同时迭代两个非平凡类对象的属性,类似于 Python 的 zip 方法

标签 c# python .net reflection iterator

如何同时迭代两个重要的类对象以检查它们的属性?

这些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/

相关文章:

c# - 将长字符串分成 60 个字符的长行但不要打断单词

c# - 读取Word文件 文件似乎已损坏

python - 使用 re 和 urllib.request 模块

c# - Visual Studio 开始构建之前的长时间延迟

python - 使用多处理从不同进程附加到同一个列表

python - 如何通过试用来测试扭曲的网络资源?

C# SMO 和 SqlEnum 引用错误

c# - 是否可以在不允许升级到 DTC 的情况下将 .NET 的 TransactionScope 与 Sql Server 2005 一起使用?

c# - VSTO word 加载项应用程序中的等待光标

c# - 如何在 C# 中创建带有图标的 Internet 快捷方式?