自定义业务对象比较器

时间:2011-01-04 09:52:23

标签: c# reflection .net-4.0

我需要实现比较两个业务对象并返回差异列表的机制(过去的值,新值,isDifferenceBetter)。

因为并非所有类的字段都需要进行比较,并且需要将一个字段与不同的函数进行比较,然后另一个字段(有时<有时更好>更好......)我想出了我需要实现自定义属性并将其分配给必须在此对象中进行比较的每个字段。

此属性必须具有: - 名称 - 委托或某人指向将用于比较的函数(到目前为止还不知道该怎么做)

所有人都可以建议我,如果它是一个好主意?也许还有其他想法。

使用属性我可以使用refflection来迭代每个带有属性的字段并调用所需的委托。

感谢您的帮助 再见

3 个答案:

答案 0 :(得分:0)

请参阅下面的示例。 可能是,它可以帮到你:


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;
            }
        }
    }
}

答案 1 :(得分:0)

对自我跟踪对象进行一些搜索以及ORM(如NHibernate)检查对象是否为脏字段的方式

答案 2 :(得分:0)

当然可能,但也许你应该考虑更抽象的术语。也许一对属性[LowerValueIsBetter]和[HigherValueIsBetter]可以让你以更有凝聚力的方式表达这些信息。