C# 自定义业务对象比较器

C# 自定义业务对象比较器,c#,reflection,.net-4.0,C#,Reflection,.net 4.0,我需要实现比较两个业务对象并返回差异列表(过去值、新值、isDifferenceBetter)的机制 因为并不是所有类的字段都必须进行比较,一个字段需要与不同的函数进行比较,而另一个字段(有时更好…),所以我发现我需要执行implemnt custom属性,并将它赋予此对象中必须进行比较的每个字段 此属性必须具有: -名字 -指将要用于比较的函数(目前不知道如何做) 有人能告诉我这是个好主意吗?也许还有其他想法 使用属性,我将能够使用refflection以属性遍历每个字段,并调用所需的委托 谢

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

因为并不是所有类的字段都必须进行比较,一个字段需要与不同的函数进行比较,而另一个字段(有时<更好有时>更好…),所以我发现我需要执行implemnt custom属性,并将它赋予此对象中必须进行比较的每个字段

此属性必须具有: -名字 -指将要用于比较的函数(目前不知道如何做)

有人能告诉我这是个好主意吗?也许还有其他想法

使用属性,我将能够使用refflection以属性遍历每个字段,并调用所需的委托

谢谢你的帮助 再见

请参见下面的示例。 也许,它可以帮助您:


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

搜索自跟踪对象以及ORM(如NHibernate)检查对象脏字段的方式当然可能,但也许您应该考虑更抽象的术语。也许一对属性[LowerValuesBetter]和[HigherValuesBetter]可以让您以更内聚的方式表达此信息