Как выполнить итерацию двух нетривиальных свойств объекта класса в C # одновременно, как в методе Python zip - PullRequest
0 голосов
/ 30 ноября 2018

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

Эти post1 post2 говорят о том, как это сделать собщие структуры данных по умолчанию, но что, если это пользовательский класс, и я не могу изменить его, скажем, что-то вроде

public class A
{
   public int propA { get; set; }
   public int propB { get; set; }
   ...
}

Также у него нет метода GetEnumerator().Как сделать что-то похожее на почтовый индекс Python при использовании отражения?Так что я могу сделать что-то вроде:

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
}

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Эта запись дала мне инструменты, необходимые для перечисления свойств двух классов в одном цикле 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
}
0 голосов
/ 30 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...