回调泛型类型函数

时间:2014-03-19 14:27:24

标签: c# .net generics callback

我正在尝试保存对象的通用方法的引用(“回调”)。然后,在另一个通用方法(“test”)中,我希望能够使用传递给test的相同泛型类型参数调用该已保存的回调方法(“callback”)。

这里有一些伪代码来证明我的意思:

public class A
{

    public A()
    {
        b = new B();
        b.setCallback(this.callback);   // should be a reference to the callback<T>() function of this class
        b.test<String>();   // this should now call: this.callback<String>()
    }

    public bool callback<T>()
    {
        return true;
    }
}

public class B
{
    Delegate _callback;

    public void setCallback(Delegate d)
    {
        this._callback = d; 
    }

    public bool test<T>()
    {
        return this._callback<T>();
    }
}

到目前为止,我尝试过代理人,Action&lt;&gt; s和Func&lt;&gt; s,但找不到解决方法,同时保持T型动态(然后再次,我对代表不是很有经验等等。)。我不想让整个类成为泛型类型,只是各自的方法。

有没有人知道如何处理这个问题?

非常感谢!

2 个答案:

答案 0 :(得分:1)

由于您的回调似乎没有使用任何通用参数,但您不想使B通用,因此不清楚您尝试做什么你可以这样做:

public class B
{
    Delegate _callback;

    public void setCallback<T>(Func<T> d)
    {
        this._callback = d; 
    }

    public bool test<T>()
    {
        var f = this._callback as Func<T>;
        if(f == null) throw new ArgumentException();
        T ignored = this._callback();
        return true;
    }
}

答案 1 :(得分:0)

如果我理解正确,你会希望一个类中的两个方法同时安全(如在&#34;不需要运行时转换和#34;)绑定到相同的,无约束的参数类型,但没有在类级别声明该参数类型。

如果您正在寻找的是真实答案,那么就是 。您将能够强制您的回调参数在编译时匹配Test方法的类型参数,除非它们都绑定到同一个类级别类型参数约束到某种基本类型。

可以做的是将回调参数传递给Test方法:

public T Test<T>(Func<T> callback)
{
    return callback.Invoke();
}

请注意,由于您的代码是伪代码,我冒昧地将Test方法的返回类型更改为此处的动态类型。我相信这是你的初衷。如果没有,请提供其他详细信息。