2014-12-18 22 views
5

我想創建一個幫助函數(對於一個類)接受2個對象並比較兩個類上的屬性如何創建一個方法,接受2個對象的相同類型,屬性,並比較值

這些屬性永遠只能簡單的類型,如stringintbool

使用

Compare(widget1,widget2,x => x.Name) 

我有什麼到目前爲止

private void CompareValue<T>(Order target, Order source, Func<Order, T> selector) 
    { 
    if(target.selector != source.selector) 
    { 
     // do some stuff here 
    } 
    } 

顯然上面的代碼不起作用

任何幫助,將不勝感激,謝謝

回答

10

您可以添加一個約束到IEquatable<T>

private void CompareValue<T>(Order target, Order source, Func<Order, T> selector) 
    where T : IEquatable<T> 
{ 
    if (!selector(target).Equals(selector(source)) 
    { 
     // ... Do your stuff 
    } 
} 

這將處理您指定的類型(以及其他許多類型),並允許編譯器保護您免受這種情況的影響你不適合。

請注意,您還需要致電Func<T,U>,即:selector(target)selector(source),以創建結果值。

+0

我希望的陰涼'nameof'把戲,將允許消除lambda表達式。沒有這樣的運氣。 – zmbq 2014-12-18 22:22:29

1

如果你想完全仿製版本:

public void CompareValue<TModel,TProperty>(TModel x, TModel y, Expression<Func<TModel, TProperty>> expression) 
    where TModel : class 
    where TProperty : IEquatable<TProperty> 
{ 
    MemberExpression memberExpression = expression.Body as MemberExpression; 
    Type modelType = typeof(TModel); 
    PropertyInfo propInfo = modelType.GetProperty(memberExpression.Member.Name); 

    TProperty xValue = (TProperty)propInfo.GetValue(x); 
    TProperty yValue = (TProperty)propInfo.GetValue(y); 
    if (xValue.Equals(yValue)) 
    { 
     Console.WriteLine("Match!"); 
    } 
} 

用法:

CompareValue(widget1, widget2, x => x.Name); 
+0

似乎不適用於字符串,memberExpression爲空..我使用它不正確嗎? (示例https://dotnetfiddle.net/5JDkAR) – Default 2014-12-18 23:33:32

+1

正確,這似乎工作時,TModel是一個對象,表達式是針對一個屬性,但我的技能是不是這樣的工作爲什麼 – 2014-12-19 00:10:51

+0

@Default:擊敗目的的表達如果你只是比較直線對象不是嗎?如果您想直接比較'x'和'y',則可能只需要'CompareValue (T x,T y)其中T:IEquatable '方法簽名。該表達式用於引用屬性。 – 2014-12-19 00:17:47

相關問題