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