0

この状況を見てみましょう:

private Func<int, int> callback;
public SomeClass(Func<int, int> callback)
{
    this.callback = callback;
}

その後、その関数を次のように呼び出すことができます

callback(5);

そしてそれは数値を返します。

今、私が欲しいのは次のようなものです

private Func<T1, T2> callback;
public SomeClass(Func<T1, T2> callback)
{
    this.callback = callback;
}

そのデリゲートは、次のようなシグネチャを持つ関数を受け入れます

public T1 SomeFunc<T1, T2>(T2)

によって呼び出すことができます

callback<int, string>("hello")

これはintを返します。

これは C# で実行できますか?

4

3 に答える 3

1

プロパティを使用して、他のポスターが言ったようにクラスをジェネリックにする必要があります。

少し奇妙に見えますが、クラスをジェネリックにしたくない場合は、ジェネリックメソッドを使用してコールバック関数を取得および設定できますが、欠点は、型を追跡するための何らかの方法を考案する必要があることです。コールバックするには、それらを渡す必要があるためです。これが実際にどれほど役立つかわかりません。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

    public class CallbackTest
    {
        public CallbackTest(){}

        private object _CallBack = null;

        public Func<T1, T2> GetCallBack<T1,T2>()
        {            
                return (Func<T1, T2>)_CallBack;
        }

        public void SetCallBack<T1, T2>(Func<T1, T2> value)
        {
            _CallBack = value;
        }



    }
    class Program
    {
        static void Main(string[] args)
        {

            CallbackTest t = new CallbackTest();
            t.SetCallBack(new Func<int, int>(x => x * x));

            Console.WriteLine(t.GetCallBack<int, int>()(10));

            t.SetCallBack(new Func<string, string>(x => x.ToUpper()));

            Console.WriteLine(t.GetCallBack<string, string>()("test"));

            Console.ReadLine();


        }
    }
}
于 2012-04-05T20:07:17.627 に答える