List的返回类型
本文关键字:返回类型 List | 更新日期: 2023-09-27 17:49:30
嗨,我需要找到一种方法来声明一个方法的匿名类型。这是我的代码:
public List<var> ListOfProducts(string subcategory)
{
var products = (from p in dataContext.Products
join s in dataContext.SubCategories.Where(x => x.SubCatName == subcategory)
on p.SubcatId equals s.SubCatId
join b in dataContext.Brands on p.BrandId equals b.BrandId
select new
{
Subcategory = s.SubCatName,
Brand = b.BrandName,
p.ProductName,
p.ProductPrice
});
return products;
}
我不知道我应该为这个方法设置什么类型的List。在这种情况下我该怎么做?
不能从方法返回Anonymous Type
。
为你的类型创建一个类并返回。
public class Product
{
string Subcategory { get; set; }
string Brand { get; set; }
string ProductName { get; set; }
decimal ProductPrice { get; set; }
}
然后返回:
var products = (from p in dataContext.Products
join s in dataContext.SubCategories.Where(x => x.SubCatName == subcategory) on p.SubcatId
equals s.SubCatId
join b in dataContext.Brands on p.BrandId equals b.BrandId
select new Product
{
Subcategory = s.SubCatName,
Brand = b.BrandName,
p.ProductName,
p.ProductPrice
});
return products;
编辑:澄清我的第一个声明,正如@JamesMichaelHare指出的那样,技术上可以通过返回object
或dynamic
从方法返回匿名类型,但它可能比它的价值更麻烦,因为你必须使用Reflection
或其他方式访问你的对象的属性。
根据MSDN,动态类型允许发生这种情况的操作绕过编译时类型检查。相反,这些操作在运行时解决。
所以试试这个:
public IEnumerable<dynamic> ListOfProducts(string subcategory)
我想说的是,你应该为此定义另一个模型,如果你将返回的结果用于表示层,你应该定义ViewModel,或者如果你使用分发层,你可以定义Dto对象
public class ProductDto
{
public string Subcategory {get; set; }
public string Brand { get; set; }
public string ProductName{ get; set; }
public decimal ProductPrice{ get; set; }
}
请注意:匿名类型被设计为在方法(或函数)的作用域内使用,而不是在它的作用域外。
但是有一种方法可以通过一些扩展方法和一些额外的类型来做到这一点(我不喜欢这样):
(在你的代码中,你应该添加。tolist()到你的LINQ表达式。)
扩展方法有:
static List<T> InitList<T>(this T o) { return new List<T>(); }
static T CastToThis<T>(this T target, object o) { return (T)o; }
你可以初始化一个匿名列表:
var list = new { Name = "Name", Age = 40 }.InitList();
现在通过使用
将方法的返回对象强制转换为该列表的类型:list = list.CastToThis(returnedValueOfYourMethod);
还有一件事:匿名类型只在程序集中有效,不能跨程序集边界传递。从这里:
c#规范保证当您在一个程序集中的两个地方使用"相同"匿名类型时,这些类型统一为一个类型。为了"相同",两个匿名类型必须具有完全相同的成员名和完全相同的成员类型,并且顺序完全相同。
总而言之,我不明白你为什么要这样做,因为声明一个新类型要实际得多,如果你真的需要它,你应该看看c#中的动态类型,如果你想做一些更神奇的事情,你应该使用反射。