如果泛型类型是引用类型,如何将泛型类型设置为输出类型

本文关键字:泛型类型 设置 类型 输出 引用类型 如果 | 更新日期: 2023-09-27 18:30:36

我有一个方法叫做

T GetService<T>(int serviceId);

我想知道有什么方法可以在不指定类型参数的情况下调用此方法

我试过了

T GetService<T>(int serviceId) where T: new();

T GetService<T>(int serviceId) where T: class, new();

T GetService<T>(int serviceId) where T: MyClassName

但是所有的方法都失败了,

任何人都可以帮助我解决这个问题,

你们中很少有人可能也怀疑我为什么需要它,

的实际问题是我有一种方法

IEnumerable<IGrouping<string, MyClassName>> GroupItems(string ItemName)
{
    using(var db = new dbEntities())
    {
       return db.Catagories.Include("Proucts").where(c => c.name == ItemName).ToList().GroupBy(I => I.productId);
    }
 }

它给出了代码分析警告,说"不要在成员签名中嵌套泛型类型",我想在不更改调用方的任何内容的情况下解决这个问题这就是为什么我想使这种方法成为通用方法,并且我上面写的问题提出了。

如果泛型类型是引用类型,如何将泛型类型设置为输出类型

如果您在使用 <T> 声明的泛型类中返回类型 IEnumerable<IGrouping<string, MyClass>> 有错误,那么我猜您的返回类型实际上应该是IEnumerable<IGrouping<string, T>> ...当然,如果没有看到你的代码,这只能是一个猜测。

看来您有多个问题,但我要回答您的第一个问题:

我想知道有什么方法可以调用此方法 不指定类型参数

简短回答:使用方法签名,您无法

解释:你似乎想要的是类型推断。有了这个,我假设您希望能够编写:

MyServiceType s = GetService(serviceId); 

而不是:

MyServiceType s = GetService<MyServiceType>(int serviceId).

类型推断从右到左有效(此处简化了很多)。编译器不会根据结果分配到的变量的提示推断 T。仅当 T 是方法参数的一部分时才对方法进行推理,并且这不是您的情况(您只有一个 int)。