如何创建接受相同Type,属性的2个对象并比较值的方法

时间:2014-12-18 22:10:00

标签: c# compare

我试图创建一个辅助函数(对于一个类),它接受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
     }
  }

显然上面的代码不起作用

2 个答案:

答案 0 :(得分: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),以创建结果值。

答案 1 :(得分: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);