[英]Custom business object comparer
我需要實現比較兩個業務對象並返回差異列表(過去值,新值,isDifferenceBetter)的機制。
因為不是所有類的字段都必須進行比較,並且一個字段需要與其他函數進行比較,所以另一個字段(有時<有時更好>有時更好),我發現我需要實現自定義屬性並將其賦予此對象中必須比較的每個字段。
此屬性必須具有:-名稱-委托或sth指向將用於比較的函數(到目前為止尚不知道該怎么做)
那么有人可以建議我,如果這是個好主意嗎? 也許還有其他想法。
使用屬性,我將能夠使用反射來遍歷具有屬性的每個字段並調用所需的委托。
謝謝你再見
請參閱下面的示例。 也許可以,它可以幫助您:
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)檢查對象是否存在臟字段的方法
當然有可能,但也許您應該考慮更抽象的術語。 也許一對屬性[LowerValueIsBetter]和[HigherValueIsBetter]可以使您以更緊密的方式表達此信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.