Пользовательский компаратор бизнес-объектов - PullRequest
1 голос
/ 04 января 2011

Мне нужно реализовать механизм, который сравнивает два бизнес-объекта и возвращает список различий (прошлое значение, новое значение, isDifferenceBetter).

Поскольку не все поля класса должны сравниваться, а одно поле необходимосравнивать с другой функцией, чем с другой (иногда <лучше иногда> лучше ...) Я понял, что мне нужно реализовать пользовательский атрибут и дать его каждому полю, которое нужно сравнить в этом объекте.

Этот атрибут должен иметь: - name - делегат или sth для указания функции, которая будет применяться для сравнения (пока не знаю, как это сделать)

Так что кто-нибудь может мне подсказать, если это хорошая идея?Возможно любые другие идеи.

Используя атрибуты, я мог бы использовать рефлексию для перебора каждого поля с атрибутом и вызова необходимого делегата.

спасибо за помощь, пока

Ответы [ 3 ]

0 голосов
/ 04 января 2011

Выполните поиск по объектам самообследования и способам ORM (например, NHibernate) проверять объект на наличие грязных полей

0 голосов
/ 04 января 2011

Конечно, возможно, но, возможно, вам следует подумать о более абстрактных терминах.Возможно, пара атрибутов [LowerValueIsBetter] и [HigherValueIsBetter] позволят вам выразить эту информацию более связным способом.

0 голосов
/ 04 января 2011

Смотрите мой пример ниже.Может быть, это может помочь вам:


namespace ConsoleApplication5
{
    class FunctionToCompareAttribute : Attribute
    {
        public FunctionToCompareAttribute( String className, String methodName )
        {
            ClassName = className;
            MethodName = methodName;
        }

        public String ClassName
        {
            get;
            private set;
        }

        public String MethodName
        {
            get;
            private set;
        }
    }

    class ComparableAttribute : Attribute
    {
    }

    class CompareResult
    {

    }

    [Comparable]
    class ClassToCompare
    {
        [FunctionToCompare( "ConsoleApplication5.ClassToCompare", "MyCompareFunction" )]
        public String SomeProperty
        {
            get;
            private set;
        }

        public static CompareResult MyCompareFunction( Object left, Object right, String propertyName )
        {
            return null;//Comparsion
        }
    }

    class Program
    {
        static void Main( string[] args )
        {
            var left = new ClassToCompare();
            var right = new ClassToCompare();

            var type = typeof( ClassToCompare );

            var typeAttributes = type.GetCustomAttributes( typeof( ComparableAttribute ), true );

            if ( typeAttributes.Length == 0 )
                return;

            foreach ( var property in type.GetProperties() )
            {
                var attributes = property.GetCustomAttributes( typeof( FunctionToCompareAttribute ), true );

                if ( attributes.Length == 0 )
                    continue;

                var compareAttribute = attributes[ 0 ] as FunctionToCompareAttribute;

                var className = compareAttribute.ClassName;
                var methodName = compareAttribute.MethodName;

                var compareType = Type.GetType( className );

                var method = compareType.GetMethod( methodName, new Type[] { type, type, typeof( String ) } );

                var **result** = method.Invoke( null, new Object[] { left, right, property.Name } ) as CompareResult;
            }
        }
    }
}

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