代码之家  ›  专栏  ›  技术社区  ›  Joel Coehoorn

隐式转换为函数

  •  7
  • Joel Coehoorn  · 技术社区  · 17 年前

    假设我有一个界面 IMyInterface<T> 它简单地描述了一个函数:

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

    我可以用 Func<T, T> Func<T,T> 这样我就可以将匿名委托或lambda作为参数传递给接受此接口作为参数的函数,就像我使用 函数<T、 T> 相反?

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

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

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

    1 回复  |  直到 5 年前
        1
  •  4
  •   Noldorin    17 年前

    由于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<string>(x => return x + " world", "hello");
    

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