C# 将类似的方法浓缩成一个超级冷却方法

C# 将类似的方法浓缩成一个超级冷却方法,c#,C#,我试图删除重复的代码,但在这里遇到了一个问题: 我有五个非常相似的实体(不同的资产类型,例如债券、股票)。我试图浓缩的方法返回了一些关于这些资产的统计数据。统计数据是在Linq的帮助下获得的,查询几乎相同 在之前,我的控制器中有五种不同的方法(例如BondStatistics、StockStatistics)。其中之一如下所示(db是我的数据库上下文,它定义了每种资产类型): 我在谷歌上搜索到,将这些内容重写为一种方法的一种方法是使用反射。然而,我想我可以用一条肮脏的捷径,比如: public

我试图删除重复的代码,但在这里遇到了一个问题:

我有五个非常相似的实体(不同的资产类型,例如债券、股票)。我试图浓缩的方法返回了一些关于这些资产的统计数据。统计数据是在Linq的帮助下获得的,查询几乎相同

之前,我的控制器中有五种不同的方法(例如BondStatistics、StockStatistics)。其中之一如下所示(db是我的数据库上下文,它定义了每种资产类型):

我在谷歌上搜索到,将这些内容重写为一种方法的一种方法是使用反射。然而,我想我可以用一条肮脏的捷径,比如:

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