繁体   English   中英

调用代理而不指定代理的参数

[英]Call a delegate without specifying delegate's parameter

我有两个类似的功能,希望能够重构以消除重复:

IEnumerable<TotalType> GetTotalForMonths(string id, DateTime lastTotalDate)
{
    for (int i = 0; lastTotalDate.AddMonths(i + 1) <= DateTime.Now; i++)
    {
        var totalStartDate = new DateTime(lastTotalDate.AddMonths(i).Year, lastTotalDate.AddMonths(i).Month, 1);
        var totalEndDate = totalStartDate.AddMonths(1);
        var total = this.GetTotal(id, totalStartDate, totalEndDate);
        yield return new TotalType(id, total, new TimeInterval(totalStartDate, totalEndDate));
    }
}

另一个人几天都做同样的事情。 我希望传递一个代表来概括特定的持续时间(天,月等)。 我尝试传递Func<DateTime, DateTime> addTime ,它工作得很好,除了我不想指定addTime的arg值。

建议?

我不确定我是否正确理解了您的问题,但是如果您想将AddMonth方法作为参数传递,而不指定接收者对象,则可以构造一个lambda:

GetTotal(id, lastDate, (dt, num) => dt.AddMonth(num))

调用“通用”函数。

您需要将函数声明为:

IEnumerable<TotalType> GetTotal(string id, DateTime lastTotalDate,
   Func<DateTime, int, DateTime> adder)
var byMonths = GetTotal(123, yourDate, (d, i) => d.AddMonths(i));

var byDays = GetTotal(456, anotherDate, (d, i) => d.AddDays(i));

// ...

IEnumerable<TotalType> GetTotal(
    string id, DateTime lastTotalDate, Func<DateTime, int, DateTime> adder)
{
    for (int i = 0; adder(lastTotalDate, i + 1) <= DateTime.Now; i++)
    {
        var temp = adder(lastTotalDate, i);
        var totalStartDate = new DateTime(temp.Year, temp.Month, 1);
        var totalEndDate = adder(totalStartDate, 1);
        var total = this.GetTotal(id, totalStartDate, totalEndDate);
        var interval = new TimeInterval(totalStartDate, totalEndDate);

        yield return new TotalType(id, total, interval);
    }
}

您要执行的操作称为“固化”。 我在vb.net中有一个用于此目的的模式; 我不确定这是最好的模式,但是它应该适合于C#,而不会带来太多麻烦。 请注意,虽然使用lambda表达式会限制您使用编辑并继续的能力,但使用curry工厂不会造成这种限制。

这是我的问题的链接: 咖喱委托参数的最佳模式是什么(使用.NET 2.0或更高版本)?

那应该很好地转换为C#。 每当您看到以“(Of)开头的括号时,请用尖括号替换;“ ByRef Foo As Bar”和“ Dim Foo As Bar”都将变为“ Bar Foo”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM