我正在尝试删除重复的代码并在此处遇到问题:
我有五个非常相似的实体(不同的 Assets 类型,例如债券、股票)。我试图压缩的方法返回一些关于这些 Assets 的统计数据。统计数据是借助 Linq 获得的,查询几乎完全相同。
之前,我的 Controller 中有五个独立的方法(例如 BondStatistics、StockStatistics)。其中之一看起来像这样(db 是我的数据库上下文,它定义了每种 Assets 类型):
public JsonResult BondStatistics()
{
var items = db.Bonds.ToList();
var result = new[]
{
new
{
key = "Bonds",
values = items.Select(i =>
new {
x = i.priceChangeOneDayInEuro,
y = i.priceChangeTotalInEuro,
size = i.TotalValueInEuro,
toolTip = i.Description
}
)
},
};
return Json(result, JsonRequestBehavior.AllowGet);
}
我在谷歌上搜索过,将它们重写为一种方法的一种方法可能是使用反射。然而,我想我可以使用一个肮脏的捷径,像这样:
public JsonResult Scatter(string asset)
{
if (asset == "Stocks") { var items = db.Stocks.ToList(); };
if (asset == "Bonds") { var items = db.Bonds.ToList(); };
if (asset == "Futures") { var items = db.Futures.ToList(); };
if (asset == "Options") { var items = db.Options.ToList(); };
if (asset == "Funds") { var items = db.Funds.ToList(); }
var result = new[]
{
new
{
key = asset,
values = items.Select(i =>
new {
x = i.priceChangeOneDayInEuro,
y = i.priceChangeTotalInEuro,
size = i.TotalValueInEuro,
toolTip = i.Description
}
)
},
};
return Json(result, JsonRequestBehavior.AllowGet);
}
这会导致在设计时 Linq 查询中“项目”的类型未知的问题。
克服这个问题的好方法是什么?使用一些完全不同的模式,使用反射还是有一个简单的解决方法?
编辑 按照建议,我创建了一个接口(interface)并让 BaseAsset 类实现它。然后,将压缩方法更改为
List<IScatter> items = new List<IScatter>();
if (asset == "Stocks") { items = db.Stocks.ToList<IScatter>(); };
if (asset == "Bonds") { items = db.Bonds.ToList<IScatter>(); };
if (asset == "Futures") { items = db.Futures.ToList<IScatter>(); };
if (asset == "Options") { items = db.Options.ToList<IScatter>(); };
if (asset == "Funds") { items = db.Funds.ToList<IScatter>(); }
终于在设计时起作用了。非常感谢!
最佳答案
您正在将所有内容放入 var
,但是您正在处理的项目的类型到底是什么?
如果是 List<Stock>
对于 db.Stocks.ToList()
, List<Bond>
对于 db.Bonds.ToList()
您可以简单地定义一个接口(interface)(例如 IHasPriceInformation
),其中包含您在 LINQ 查询中使用的字段。然后,让 Stock
, Bond
和其他人实现此接口(interface)(或提供它们的抽象基础实现)并简单地在 List<IHasPriceInformation>
上运行您的 LINQ 查询.
关于c# - 将相似的方法浓缩成一个 super 酷的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553484/