【问题标题】:Implicit conversion to Func隐式转换为 Func
【发布时间】:2010-10-29 09:24:09
【问题描述】:

假设我有一个接口IMyInterface<T>,它只描述了一个功能:

public interface IMyInterface<T>
{
    T MyFunction(T item);
}

我可以将其替换为Func&lt;T, T&gt;,但出于语义原因我想要该界面。我是否可以在该接口和Func&lt;T,T&gt; 之间定义一个隐式转换,以便我可以将匿名委托或 lambda 作为参数传递给接受此接口作为参数的函数,就像我使用了Func&lt;T,T&gt; 一样?

为了演示,使用上面声明的接口,我想要一个这样的函数:

public T TestFunction<T>(IMyInterface myInterface, T value)
{
    return myInterface.MyFunction(value);
}

我可以这样称呼:

TestFunction(x => x + " world", "hello");

结果将是“hello world”。

【问题讨论】:

  • 你的意思是在第二个代码块中调用 IMyInterface.MyFunction() 吗?

标签: c# delegates lambda anonymous-methods implicit


【解决方案1】:

由于 C# 中的接口不能包含运算符的定义(或任何静态方法),我相信答案是。另一种方法是使用一个类(不幸的是不能是抽象的,因为静态成员/运算符在这里并不比在接口中更好)。这将允许您定义 implicit 转换运算符,因此能够准确地使用您指定的类型。

在类中(如果需要,您可以将其设为virtual),您可以将其定义如下。

public class MyClass<T>
{
    public static implicit operator MyClass<T>(Func<T, T> func)
    {
        return new MyClass<T>() { MyFunction = func };
    }

    public MyClass()
    {
    }

    public Func<T, T> MyFunction
    {
        get;
        set;
    }
}

您在问题中对TestFunction 的定义应该与您编写的代码完全相同。

public T TestFunction<T>(IMyInterface myInterface, T value)
{
    return myInterface.MyFunction(value);
}

同样是对TestFunction的调用:

TestFunction<string>(x => return x + " world", "hello");

这可能不是您想要的,但它仍然相当接近,而且很可能是您能得到的最好的。

【讨论】:

  • TestFunction 如何将 lambda 转换为 IMyInterface?您定义了一个 MyClass 类,而不是一个接口。我认为需要更多的编辑...
  • @Earwicker:仔细看看 - 隐式转换运算符应该为您执行此操作,除非我弄错了。另外,如果您阅读了我的帖子的开头,我会提到使用接口是不可能的,只有一个(非抽象)类。
  • 这几乎是我所期望的,但我以前会忽略一些事情,希望这次也是如此。可悲的是,事实并非如此。事实上,我已经有了自己的具体实现,与您发布的内容非常相似。
  • 是的,任何“更好”的东西都需要对静态接口的支持,不幸的是,这不存在(可能是未来版本的 C# 的东西?)。至少在设计方面这是一个积极的迹象,我们已经实现了非常相似的实现。 :)
  • 我知道已经有一段时间了,但是在您对TestFunction 的定义中,IMyInterface 的定义是什么?您的代码不起作用,因为在用户定义的转换之前只能发生标准的隐式转换,并且从 lambda(或匿名方法)到委托的转换不是其中之一(参见规范 6.3.1)。 (另外,在没有大括号的 lambda 中 return 是非法的。)
猜你喜欢
  • 2011-08-17
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多