泛型类型变量限制和接口

kol*_*osy 5 c# generics

我正在实现一个通用接口(特别是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?我可以以某种方式明确测试这两个条件并强制类型变量吗?

Nat*_*n W 2

你可以尝试这样的事情:

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)

  • *叹气*虽然这确实有效,但这太令人讨厌了,尤其是在框架级代码中。 (2认同)