我是C#的初学者,对正确理解泛型类型有些麻烦。在此示例中,我想以某种方式将查询结果存储到变量中。
我在下面显示的代码不正确,因为应该指定通用类型T。
TestCase
是否可以在不声明仅用于一种用途的特殊类的情况下做到这一点?
public class Data
{
public IQueryable<T> Results { get; set; }
public Data()
{
var db = new Database();
}
public void Store()
{
Results = db.Products.Select(x => new { x.ProductName, x.Cost });
}
}
此外,为什么动态类型在此示例中不适用?
public class ProductView
{
public string ProductName { get; set; }
public int Country { get; set; }
}
...
public IQueryable<ProductView > Results { get; set; }
答案 0 :(得分:4)
有3种方法可以解决此问题:
1)创建您提到的类似ProductView
的类-经典C#6或更旧的方式
2)使用dynamic
代替T
,例如:public IQueryable<dynamic> Results { get; set; }
-不建议使用,因为这样会增加运行时错误的风险并降低可读性
3)使用tuples(C#7功能):
public IQueryable<(string, int)> Results { get; set; } // I suppose ProductName is string and Cost is int
public void Store()
{
Results = db.Products.Select(x => (x.ProductName, x.Cost));
}
答案 1 :(得分:0)
这里的问题是您的Data
类似乎了解有关T
的一些特定知识。在Store
方法中,它读取Products
并从每个项目中获得两个特定的属性。因此,它实际上不是可以存储任何类型的泛型类。这很具体。
要使其通用,您需要删除Store
方法。剩下的就不多了。您需要确定Data
的目的是什么。它存在什么问题要解决?