c # отражение, сравнивающее 2 объекта с логическими свойствами - PullRequest
0 голосов
/ 29 октября 2018

У меня есть два объекта с несколькими свойствами, которые имеют тип логический. Свойства идентичны с точки зрения именования, и я просто хочу убедиться, что они равны. Я делаю много этих проверок и хочу знать, есть ли у кого-нибудь предложение о методе, который может выполнить следующий код за один шаг, но достаточно динамичен, чтобы проверить параметры свойства по имени, если они имеют одинаковое имя?

 if (options != null && other != null)
            return options.Quantities == other.Quantities &&
                   options.SKUEntityKey == other.SKUEntityKey &&
                   options.LineItemType_Type == other.LineItemType_Type &&
                   options.SKUIdentifier == other.SKUIdentifier &&
                   options.Identifier == other.Identifier;

Если то, что я спрашиваю, не понятно, пожалуйста, дайте мне знать

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Я надеюсь, что это ужасное консольное приложение, по крайней мере, даст представление о том, как делать то, что вы хотите:

    static void Main(string[] args)
    {
        Person steve = new Person()
        {
            IsHungry = true,
            IsLazy = false,
            IsSleepy = true
        };

        Dog bella= new Dog()
        {
            IsHungry = true,
            IsLazy = false,
            IsSleepy = true
        };

        bool match = DoAllBoolPropertiesMatch(steve, bella);

        Console.WriteLine($"\r\n----> Do Bools in Objects Match?: {match}");
    }

    private static bool DoAllBoolPropertiesMatch(object obj1, object obj2)
    {
        // For each Boolean property of object 1, check object 2:
        foreach(PropertyInfo propInfo in obj1.GetType().GetProperties())
        {
            // Property is boolean.
            if(propInfo.PropertyType == typeof(Boolean))
            {
                // Look for a property on obj2 with the same name that also returns a bool.
                PropertyInfo matchingPropInfo = obj2.GetType().GetProperty(propInfo.Name, typeof(Boolean));

                if(matchingPropInfo != null)
                {
                    Console.WriteLine($"Evaluating Property {propInfo.Name} from obj1:");
                    Console.WriteLine($"  - Value for Obj1 = [{propInfo.GetValue(obj1)}]");
                    Console.WriteLine($"  - Value for Obj2 = [{matchingPropInfo.GetValue(obj2)}]");

                    if(Convert.ToBoolean(propInfo.GetValue(obj1)) != Convert.ToBoolean(matchingPropInfo.GetValue(obj2)))
                        return false;
                }
            }
        }

        return true;
    }

    public class Person
    {
        public bool IsHungry { get; set; }
        public bool IsSleepy { get; set; }
        public bool IsLazy { get; set; }
    }

    public class Dog
    {
        public bool IsHungry { get; set; }
        public bool IsSleepy { get; set; }
        public bool IsLazy { get; set; }
    }
0 голосов
/ 29 октября 2018
   class Program
    {
        static void Main(string[] args)
        {
            ReflectOverProperties<TestClass, TestClass2>(new TestClass(), new TestClass2());
            Console.ReadLine();
        }

        public static void ReflectOverProperties<T, Z>(T x, Z y)
        {
            var properties = typeof(T).GetProperties();
            foreach (var item in properties)
            {
                CompareProperty(x, y, item.Name);

            }
        }

        private static void CompareProperty<T, Z>(T x, Z y, string itemName)
        {
            dynamic originalValue = GetPropValue(x, itemName);
            dynamic newValue = GetPropValue(y, itemName);
            PropertyCompare(itemName, originalValue, newValue);

        }

        private static void PropertyCompare(string itemName, dynamic originalValue, dynamic newValue)
        {
            if (originalValue != newValue)
            {
             Console.Write($"Property {itemName} does not match");
            }
        }



        public static object GetPropValue(object src, string propName)
        {
            return src.GetType().GetProperty(propName).GetValue(src, null);
        }
    }

    public class TestClass
    {
        public TestClass()
        {
            Test1 = false;
            Test2 = false;
            Test3 = false;
        }
        public bool Test1 { get; set; }
        public bool Test2 { get; set; }
        public bool Test3 { get; set; }
    }
    public class TestClass2
    {
        public TestClass2()
        {
            Test1 = false;
            Test2 = false;
            Test3 = true;
        }
        public bool Test1 { get; set; }
        public bool Test2 { get; set; }
        public bool Test3 { get; set; }
    }

Вот код, который я довольно быстро изменил, который запускается в консольном приложении. Надеюсь, вы установили правильное направление, теперь один и тот же объект может быть другим. Просто используя некоторые основные отражения и динамические свойства.

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