7

IMyInterface<T>1 つの関数を単純に記述するインターフェースがあるとします。

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

これを に置き換えることもできFunc<T, T>ますが、セマンティック上の理由からインターフェイスが必要です。そのインターフェイスとの間の暗黙的な変換を定義して、代わりにFunc<T,T>使用した場合と同じように、このインターフェイスをパラメーターとして受け入れる関数に引数として匿名デリゲートまたはラムダを渡すことができるようにすることはできますか?Func<T,T>

上記で宣言されたインターフェースを使用して実証するには、次のような関数が必要です。

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

私はこのように呼び出すことができます:

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

結果は「hello world」になります。

4

1 に答える 1

4

C# のインターフェイスには演算子の定義 (または静的メソッド) を含めることができないため、答えはnoだと思います。別の方法は、クラスを使用することです (静的メンバー/演算子はここではインターフェイスよりも優れているため、残念ながら抽象化することはできません)。これにより、変換演算子を定義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");

これはまさにあなたが探しているものではないかもしれませんが、それでもかなり近いものであり、おそらくあなたが得ることができる最高のものです.

于 2009-05-27T19:42:38.153 に答える