c# - 隐式转换为 Func

标签 c# delegates lambda anonymous-methods implicit

假设我有一个接口(interface) IMyInterface<T>简单地描述了一个功能:

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

我可以将其替换为 Func<T, T> ,但出于语义原因我想要接口(interface)。我可以定义该接口(interface)和 Func<T,T> 之间的隐式转换吗?这样我就可以将匿名委托(delegate)或 lambda 作为参数传递给接受此接口(interface)作为参数的函数,就像我使用了 Func<T,T> 一样。相反?

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

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

我可以这样调用:

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

结果将是“hello world”。

最佳答案

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

在类中(如果需要,您可以将其设为 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");

这可能不是您正在寻找的东西,但它仍然相当接近,而且很可能是您能够获得的最好的。

关于c# - 隐式转换为 Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917616/

相关文章:

events - 除了 UI 之外,您还以何种方式使用委托(delegate)和/或事件?

C# 3.5 DLR Expression.Dynamic 问题

c# - 除非调用线程空闲(方法已完成),否则不会调用 WebRequest 回调

c# - 阐明 C# 扩展方法的优先级

c# 仅使用方法名称(文本)向事件添加监听器

c# - 回调的概念 (C#)

c# - Microsoft.Owin.Host.SystemWeb 并且仍然在上下文中找不到 owin.Environment 项目

c# - 在泛型类中注入(inject)依赖项时出错

c++ - 返回带有函数捕获的 lambda

c# - 从反射转向表达式树