我正在编写这个实现 IEqualityComparer 的简洁类,这样我就可以将任何匿名类型传递给它(或者实际上是任何具有属性的类型),它会通过比较类型的属性值来自动比较类型。
public class CompareProperty<T> : IEqualityComparer<T>
{
private Type type;
private PropertyInfo propInfo;
private string _fieldName;
public string fieldName
{
get;
set;
}
public CompareProperty(string fieldName)
{
this.fieldName = fieldName;
}
public bool Equals<T>(T x, T y)
{
if (this.type == null)
{
type = x.GetType();
propInfo = type.GetProperty(fieldName);
}
object objX = propInfo.GetValue(x, null);
object objY = propInfo.GetValue(y, null);
return objX.ToString() == objY.ToString();
}
}
我认为这是一个很好的小助手功能,我可以多次使用。
为了使用它,我必须这样做:
var t = typeof(CompareProperty<>);
var g = t.MakeGenericType(infoType.GetType());
var c = g.GetConstructor(new Type[] {String.Empty.GetType()});
var obj = c.Invoke(new object[] {"somePropertyName"});
很公平,但是我该如何处理它返回的 obj 变量呢?
someEnumerable.Distinct(obj);
distinct 扩展函数的重载不接受这个,因为它看不到 IEqualityComparer 类型,当然它只看到一个对象。
someEnumerable.Distinct((t) obj);
someEnumerable.Distinct(obj as t);
这也行不通。找不到类型/命名空间(红色下划线)。
我该如何直截了当?