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);
個別の拡張関数のオーバーロードはこれを受け入れません。IEqualityComparer 型が表示されないためです。もちろん、オブジェクトのみが表示されます。
someEnumerable.Distinct((t) obj);
someEnumerable.Distinct(obj as t);
これも機能しません。型/名前空間が見つかりません (赤い下線)。
どうすればこれをまっすぐにできますか?