我试图创建一个辅助函数(对于一个类),它接受2个对象并比较两个类的属性
这些属性只是简单类型,例如string
,int
和bool
用法
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
}
}
显然上面的代码不起作用
答案 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);