使用具有通用参数的方法作为回调

时间:2012-04-05 19:22:14

标签: c# function delegates callback

让我们看看这种情况:

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#中完成吗?

3 个答案:

答案 0 :(得分:1)

当然,但你也需要让这个类变得通用。

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

答案 1 :(得分:1)

如果您在本地存储回调,最简单的方法是使该类具有通用性:

public class SomeClass<TParam, TReturn>
{
    private Func<TParam, TReturn> _callback;

    public class SomeClass(Func<TParam, TReturn> callback)
    {
        _callback = callback;
    }
}

答案 2 :(得分: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();


        }
    }
}