我正在实现一个通用接口(特别是iqueryprovider).在某些时候,我被迫返回一个通用结果,我需要从一些内部接口获取:
public TResult Execute<TResult>(...) {
return something.Foo<TResult>();
}
Run Code Online (Sandbox Code Playgroud)
什么东西.Foo是
public T Foo<T>() where T: MyBaseClass, new() {
...
}
Run Code Online (Sandbox Code Playgroud)
这当然会爆炸,因为外部定义的TResult与内部定义的T没有相同的类型限制.问题是:有没有办法让TResult适合Foo?我可以以某种方式明确测试这两个条件并强制类型变量吗?
你可以尝试这样的事情:
public TResult Execute<TResult>(...)
{
if (typeof(TResult) is MyBaseClass)
{
Type mytype = typeof(TResult);
MethodInfo method = typeof({TypewhereFoo<>IsDeclared}).GetMethod("Foo");
MethodInfo generic = method.MakeGenericMethod(myType);
return (TResult)generic.Invoke(this, null);
}
else
{
// Throw here
}
}
Run Code Online (Sandbox Code Playgroud)