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

当然可以,但是您还需要使该类成为通用类。

Class SomeClass<T1, T2>
{
    private Func<T1, T2> callback;
    public SomeClass(Func<T1, T2> callback)
    {
        this.callback = callback;
    }
 }
于 2012-04-05T19:25:19.870 回答
1

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

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

    public class SomeClass(Func<TParam, TReturn> callback)
    {
        _callback = callback;
    }
}
于 2012-04-05T19:26:32.043 回答
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 回答