我正在尝试保存对象的通用方法的引用(“回调”)。然后,在另一个通用方法(“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型动态(然后再次,我对代表不是很有经验等等。)。我不想让整个类成为泛型类型,只是各自的方法。
有没有人知道如何处理这个问题?
非常感谢!
答案 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
方法的返回类型更改为此处的动态类型。我相信这是你的初衷。如果没有,请提供其他详细信息。