1

我是 C# 的初学者,在正确理解泛型类型时遇到了一些麻烦。在此示例中,我想以某种方式将查询结果存储到变量中。

我在下面显示的代码不正确,因为应该指定泛型类型 T。

    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; }

另外,为什么动态类型不适合这个例子?

public dynamic Results { get; set; }
4

2 回答 2

4

有3种方法可以解决这个问题:

1)创建ProductView您提到的类 - 经典 C#6 或更旧的方式

2)使用dynamic而不是T喜欢:public IQueryable<dynamic> Results { get; set; }- 不推荐,因为它会增加运行时错误的风险并降低可读性

3) 使用元组(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));
}
于 2019-08-25T10:48:28.470 回答
0

这里的问题是你的Data班级似乎知道一些关于T. 在该Store方法中,它读取Products并从每个项目中获取两个特定属性。所以它实际上并不是一个可以存储任何类型的泛型类。这是非常具体的。

要使其通用,您需要删除该Store方法。然后所剩无几。你需要决定它的目的Data是什么。它存在解决什么问题?

于 2019-08-25T20:43:25.757 回答