C# 泛型类型函数的回调

C# 泛型类型函数的回调,c#,.net,generics,callback,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<

我试图保存对对象的泛型方法(“回调”)的引用。然后,在另一个泛型方法(“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>();
    }
}
公共A类
{
公共A()
{
b=新的b();
b、 setCallback(this.callback);//应该是对此类的callback()函数的引用
b、 test();//现在应该调用:this.callback()
}
公共bool回调()
{
返回true;
}
}
公共B级
{
委托回调;
公共无效集合回调(委托d)
{
这个._callback=d;
}
公共布尔测试()
{
返回此项。_callback();
}
}
到目前为止,我尝试了委托、操作和函数,但在保持t类型动态的同时,找不到解决这个问题的方法(再说一次,我对委托等方面不是很有经验)。我不想使整个类成为泛型类型,只想使用相应的方法

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


非常感谢

由于您的回调似乎没有使用任何泛型参数,因此不清楚您想做什么,但是如果您不想使
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;
    }
}
公共B类
{
委托回调;
公共无效集合回调(函数d)
{
这个._callback=d;
}
公共布尔测试()
{
var f=此.\u回调为Func;
如果(f==null)抛出新的ArgumentException();
T忽略=这一点。_callback();
返回true;
}
}

如果我理解正确,您可能希望一个类中的两个方法都安全地(如“无需运行时强制转换”)绑定到相同的无约束参数类型,但不在类级别声明该参数类型

如果这就是你想要的,那么你的问题的真正答案是不可能的。您将无法强制回调参数在编译时与
Test
方法的类型参数匹配,除非它们都绑定到同一类级别的类型参数或约束到某个基类型

但是,您可以将回调参数传递给
Test
方法:

public T Test<T>(Func<T> callback)
{
    return callback.Invoke();
}
public T测试(Func回调)
{
返回callback.Invoke();
}

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

回调是否应返回布尔值?字符串与回调的关系如何?如果要将字符串参数传递给回调函数,那么从何处获取该参数?类B有类型参数有什么问题?当回调函数似乎不带参数并返回bool时,为什么要使用泛型?这确实可行,但在编译时不会发生任何类型验证。也许OP对此没问题,但如果他是,我会问他为什么要使用泛型。不过,在目前的环境下,这是一个有价值的答案+1.