◆ 型ごとに比較関数設定できるようにするとよさそう

参照は違うけど 中の値が一緒なものをチェックしたいです

private プロパティ(フィールド) をどうするかや ループ参照もあるし 完全に自動でするのは難しそうです
ある程度なら JSON/XML にシリアライズすればいいですが 完全に型を維持しなかったり 一部がシリアライズ対象にならなかったりで求める比較ができないこともあります

Equals メソッドを実装する方法もあるらしいですが 普段からそのクラスの機能として使うならともかく 例えばテストとかそういう外部から使うために実装を変えるのはイヤです
それに外部のコンパイル済みのものとか 変更できないものだってあります


JavaScript でも完全にチェックするのは難しいので諦めたところなのですが C# では型があるので使う側の設定が必要ですができそうです


比較するときに 2 つのオブジェクトだけじゃなくて (Type => Func<object,object,bool>) な Dictionary も渡すようにします
後は型に沿って 比較関数を呼び出して比較します

これで クラス内部で比較用メソッドが定義されていなくても 型ごとに比較できます

int や string などには == する関数を指定して 匿名型にはリフレクションで public プロパティすべてを比較する関数を指定します

その他の自作クラスは public のプロパティだけでいいなら匿名型と同じもので 特別な処理が必要ならそこだけ別に関数を定義します
参照ループになる作りならそのプロパティを除外するなどです

struct なら全部 == でいけそうな気もしたのですが KeyValuePair は 値に参照型入ってることもあってその場合は参照が一緒じゃないと true になりません
struct でも 再帰的にプロパティを見ていく必要があります


JavaScript でこれをやろうとしても 基本 {} のリテラルで作ってますから constructor を持ってきてもほぼ全部 Object にしかならないですからね


まだアイデアだけで作ってないですが 気が向けば作ってみようとおもいます