c# - 将相似的方法浓缩成一个 super 酷的方法

标签 c#

我正在尝试删除重复的代码并在此处遇到问题:

我有五个非常相似的实体(不同的 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/

相关文章:

c# - 分配给事件的 lambda 是否会阻止所属对象的垃圾回收?

c# - 用于用户模板的 RazorEngine - 安全性?

c# - 在 MVC 中使用 CasSTLe Windsor 和 FluentValidation

c# - 如何将使用 EntityFramework 4.0 的 C# 应用程序升级到 4.3.1

c# - 线程的命名约定?

c# - HttpWebRequest-远程服务器返回错误 : (400) Bad Request

c# - 以异步方式启动任务的其他方式

c# - 制作一个 Buttonfield 执行一个 javascript

c# - 有没有从 Java 类到 C# 的独立转换器?

c# - 如何将 unicode(阿拉伯语)字符插入 SQL Server 数据库