Как выполнить итерацию двух нетривиальных свойств объекта класса в C # одновременно, как в методе Python zip

1

Как выполнить итерацию двух нетривиальных объектов класса одновременно, чтобы проверить их свойства?

Эти 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
}
Теги:
reflection
iterator

2 ответа

1

Для этого вам нужно использовать отражение (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 );
            }
    }
}

Надеюсь это поможет.

0

Этот пост дал мне инструменты, необходимые для перечисления свойств двух классов в одном цикле foreach

foreach(var prop in obj1.GetType().GetProperites().Zip(obj2.GetType().GetProperties(), (a,b) => Tuple.Create(a,b))
{
    var name1 = prop.Item1.Name;
    var name2 = prop.Item2.Name;

    var value1 = prop.Item1.GetValue(obj1, null);
    var value2 = prop.Item2.GetValue(obj2, null);

    // do things
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню