C# 将类似的方法浓缩成一个超级冷却方法
我试图删除重复的代码,但在这里遇到了一个问题: 我有五个非常相似的实体(不同的资产类型,例如债券、股票)。我试图浓缩的方法返回了一些关于这些资产的统计数据。统计数据是在Linq的帮助下获得的,查询几乎相同 在之前,我的控制器中有五种不同的方法(例如BondStatistics、StockStatistics)。其中之一如下所示(db是我的数据库上下文,它定义了每种资产类型): 我在谷歌上搜索到,将这些内容重写为一种方法的一种方法是使用反射。然而,我想我可以用一条肮脏的捷径,比如:C# 将类似的方法浓缩成一个超级冷却方法,c#,C#,我试图删除重复的代码,但在这里遇到了一个问题: 我有五个非常相似的实体(不同的资产类型,例如债券、股票)。我试图浓缩的方法返回了一些关于这些资产的统计数据。统计数据是在Linq的帮助下获得的,查询几乎相同 在之前,我的控制器中有五种不同的方法(例如BondStatistics、StockStatistics)。其中之一如下所示(db是我的数据库上下文,它定义了每种资产类型): 我在谷歌上搜索到,将这些内容重写为一种方法的一种方法是使用反射。然而,我想我可以用一条肮脏的捷径,比如: public
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查询中“项”的类型未知的问题
克服这个问题的好方法是什么?使用一些完全不同的模式,使用反射还是有一个简单的解决方案
编辑
正如建议的那样,我创建了一个接口并让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>(); }
List items=newlist();
if(asset==“Stocks”){items=db.Stocks.ToList();};
如果(资产=“债券”){items=db.Bonds.ToList();};
if(asset==“Futures”){items=db.Futures.ToList();};
if(asset==“Options”){items=db.Options.ToList();};
if(asset==“Funds”){items=db.Funds.ToList();}
工作,终于在设计时完成了。多谢各位 您正在将所有内容放入
var
,但您正在处理的项目的具体类型是什么
如果对于
db.Stocks.ToList()
,List
对于db.Bonds.ToList()
,您可以简单地定义一个接口(例如IHasPriceInformation
),其中包含您在LINQ查询中使用的字段。然后,让股票
、债券
和其他人实现这个接口(或提供它们的抽象基础实现),然后在列表
上运行LINQ查询。您正在将所有内容放入var
,但您正在处理的项目的具体类型是什么
如果对于
db.Stocks.ToList()
,List
对于db.Bonds.ToList()
,您可以简单地定义一个接口(例如IHasPriceInformation
),其中包含您在LINQ查询中使用的字段。然后,让股票
、债券
和其他人实现这个接口(或提供它们的抽象基础实现),然后在列表
上运行LINQ查询您可能想重新表述您的问题,因为它目前“主要基于意见”并且可能因为这个原因而被关闭。GetObject
方法在这里对您有用吗?因此,不要执行if语句,而是尝试var entity=db.GetObject(asset);var items=db.entity.ToList()代码>这完全没有经过测试,只是一个建议。@peter这正是接口的用途!当您想说在几种类型上有一个公共成员,但每个类型的实现可能是different@elgonzo是的,这是另一种方式。一般来说,我认为最好使用接口,除非有充分的理由在抽象类中这样做,但它通常也不太重要way@BenAaronson,同意。我只是尽量减少对Peter代码的修改(我在输入我的评论时没有注意到您的评论和Peters的回复),因为评论部分正处于讨论的边缘;)您可能想重新表述您的问题,因为它目前“主要基于意见”,并可能因此而关闭。这里的GetObject
方法对您有用吗?因此,不要执行if语句,而是尝试var entity=db.GetObject(asset);var items=db.entity.ToList()代码>这完全没有经过测试,只是一个建议。@peter这正是接口的用途!当您想说在几种类型上有一个公共成员,但每个类型的实现可能是different@elgonzo是的,这是另一种方式。一般来说,我认为最好使用接口,除非有充分的理由在抽象类中这样做,但它通常也不太重要way@BenAaronson,同意。我只是尽量减少对Peter代码的修改(我在输入我的评论时没有注意到您的评论和Peters的回复),因为评论部分正处于讨论的边缘;)非常感谢,我将尝试与接口进行第一次接触。接口很棒,为我节省了大量冗余代码。。。伊哈希斯堡!非常感谢,我将尝试与接口进行第一次接触。接口很棒,为我节省了大量冗余代码。。。伊哈希斯堡!
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>(); }