【问题标题】:Interface-implementing anonymous class in C#? [duplicate]在 C# 中实现接口的匿名类? [复制]
【发布时间】:2012-03-22 14:37:02
【问题描述】:

在 C# 中是否有一个构造允许您创建一个实现接口的匿名类,就像在 Java 中一样?

【问题讨论】:

标签: c# anonymous-class


【解决方案1】:

如前所述,不,这是不可能的。但是,您可以创建一个实现所需接口并在其构造函数中接受 lambda 的类,以便您可以将 lambda 转换为实现该接口的类。示例:

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));

【讨论】:

  • 哦,有点花哨!
  • 这是我见过的最好的解决方案,天才
  • 非常酷的解决方案。主要缺点是您必须为每个接口创建一个基类。有什么简单的方法让它通用吗?
  • @LouisRhys 简单,不。您需要在编译时通过直接发出 IL 代码来创建新的具体类型。这将是相当困难的。
  • @nawfal 是的,这种模式已经流传了一段时间。我已经看到它在不同的地方使用了很多次。
【解决方案2】:

没有。 C# 不支持匿名类(不能定义方法的匿名类型除外)。

【讨论】:

    【解决方案3】:

    不,Lambda 表达式不能实现比它已经实现的任何其他接口。

    你也在比较错误的东西。我猜你真的想问 C# 中的匿名类型是否可以实现接口。答案是否定的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多