21

この質問にはすでに答えがあります。

Javaと同じように、インターフェイスを実装する匿名クラスを作成できるC#の構文がありますか。


3 답변


31

すでに述べたように、いいえ、これは不可能です。ただし、希望するインターフェースを実装し、そのコンストラクター内でラムダを受け入れるクラスを作成して、ラムダをインターフェースを実装するクラスに変えることができます。例:

public class LambdaComparer<T> : IEqualityComparer<T>
{
    private readonly Func<T, T, bool> _lambdaComparer;
    private readonly Func<T, int> _lambdaHash;

    public LambdaComparer(Func<T, T, bool> lambdaComparer) :
        this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode)
    {
    }

    public LambdaComparer(Func<T, T, bool> lambdaComparer,
        Func<T, int> lambdaHash)
    {
        if (lambdaComparer == null)
            throw new ArgumentNullException("lambdaComparer");
        if (lambdaHash == null)
            throw new ArgumentNullException("lambdaHash");

        _lambdaComparer = lambdaComparer;
        _lambdaHash = lambdaHash;
    }

    public bool Equals(T x, T y)
    {
        return _lambdaComparer(x, y);
    }

    public int GetHashCode(T obj)
    {
        return _lambdaHash(obj);
    }
}

使い方(明らかに何も役に立たないが、あなたはアイデアを得る)

var list = new List<string>() { "a", "c", "a", "F", "A" };
list.Distinct(new LambdaComparer<string>((a,b) => a == b));


  • ああ、ちょっと派手ですね! - Michael Rodrigues
  • これは私がまだ見てきたこの問題のための最良の解決策です、天才 - Willem D'Haeseleer
  • とてもクールな解決策。主な欠点は、すべてのインターフェースに対して基本クラスを作成しなければならないことです。一般的にする簡単な方法はありますか? - Louis Rhys
  • @LouisRhysシンプル、いや。 ILコードを直接発行して、コンパイル時に新しい具象型を作成する必要があります。それをするのはかなり難しいでしょう。 - Servy
  • @ nawfalええ、パターンはしばらくの間浮遊しています。さまざまな場所で何度も使用されていることがわかりました。 - Servy

6

C#は匿名クラスをサポートしていません(メソッドを定義できない匿名型を除く)。


2

いいえ、Lambda式では、既に実装されている以上に追加のインターフェースを実装することはできません。

あなたはまた間違ったことを比較しています。私はあなたが本当にC#の匿名型がインターフェースを実装できるかどうか尋ねるつもりだったと思います。その答えもノーです。

リンクされた質問


関連する質問

最近の質問