将链式方法结果委托给函数体
Delegate chain method results to function body
正在尝试构建格式 delegate/function。主要用于打印练习结果。
我正在尝试访问争论的结果,但我认为我对代表的理解仍然有点糟糕。该方法在块本身中是可调用的,但我想要结果,目前它打印结果定义。
System.Func2[ConsoleApp1.LoanQueries,System.Collections.Generic.IEnumerable
1[System.Decimal]]
下面是将创建结果以进行解析的代码、解析方法和我的代码所基于的代码片段。
我的问题是:
- 这可能还是我违反了一些规则?(尝试使用 expressions/functional)
- 是否可以只声明一个委托而不是函数(这可能涉及每次格式化而不是函数。)
创建要格式化的数据
// Method bodied expression
public IEnumerable<decimal> LoanQueryBodied =>
from amount in LoanAmounts
where amount % 2 == 0
orderby amount ascending
select amount;
// Query expression:
public IEnumerable<decimal> LoanQueryExpression () =>
LoanAmounts
.Where(a => a % 2 == 0)
.OrderBy(r => r);
数据和最终格式化的方法
public static void FormatLoans<TObject>(
Func<TObject> instance,
Func<TObject, IEnumerable<decimal>> function)
{
// This is the function object but should be IEnumerable<decimal> result passed down.
// Just like TObject is passed , but how?
Console.WriteLine(string.Join(" - ",function));
}
使用方法
LoanQueries.FormatLoans<LoanQueries>(() =>
new LoanQueries()
, inst => inst.LoanQueryBodied);
LoanQueries.FormatLoans<LoanQueries>(() =>
new LoanQueries()
, inst => inst.LoanQueryExpression());
我大致基于的代码
public static class Disposable
{
public static TResult Using<TDisposable, TResult>(
Func<TDisposable> factory,
Func<TDisposable, TResult> map)
where TDisposable : IDisposable
{
using (var disposable = factory())
{
return map(disposable);
}
}
}
调用的示例
var time= Disposable
.Using(
() => new WebClient(),
client => XDocument.Parse(client.DownloadString("http://time.gov/actualtime.cgi")))
.Root
.Attribute("time")
.Value;
我想像这样链接我的方法,但如果这不可能或不好的做法,我也想知道。
您需要调用 function
和 instance
使用 ()
:
Console.WriteLine(string.Join(" - ",function(instance())));
而且显然您想 return 字符串,而不是打印它,以允许链接,所以:
public static string FormatLoans<TObject>(
Func<TObject> instance,
Func<TObject, IEnumerable<decimal>> function) =>
string.Join(" - ",function(instance()));
不过,我觉得你真的是over-complicating/over-generalising这个。您的方法不像您展示的 Disposable.Using
方法那样通用。您的方法可以这样声明:
public static string FormatLoans(IEnumerable<decimal> loans) =>
string.Join(" - ", loans);
来电者:
LoanQueries.FormatLoans(new LoanQueries().LoanQueryBodied)
LoanQueries.FormatLoans(new LoanQueries().LoanQueryExpression)
Disposable.Using
使用委托,因为它试图重新创建 using
statement。第二个参数必须在 using
语句内进行计算,这样抛出的任何异常都会导致 IDisposable
的处理,这就是为什么必须将其包装在委托中的原因。如果不是,第二个参数将在 Using
方法运行之前被评估,并且错过了整个要点。
但是,您的方法没有那样的特殊要求,因此您不需要委托。
正在尝试构建格式 delegate/function。主要用于打印练习结果。
我正在尝试访问争论的结果,但我认为我对代表的理解仍然有点糟糕。该方法在块本身中是可调用的,但我想要结果,目前它打印结果定义。
System.Func2[ConsoleApp1.LoanQueries,System.Collections.Generic.IEnumerable
1[System.Decimal]]
下面是将创建结果以进行解析的代码、解析方法和我的代码所基于的代码片段。
我的问题是:
- 这可能还是我违反了一些规则?(尝试使用 expressions/functional)
- 是否可以只声明一个委托而不是函数(这可能涉及每次格式化而不是函数。)
创建要格式化的数据
// Method bodied expression
public IEnumerable<decimal> LoanQueryBodied =>
from amount in LoanAmounts
where amount % 2 == 0
orderby amount ascending
select amount;
// Query expression:
public IEnumerable<decimal> LoanQueryExpression () =>
LoanAmounts
.Where(a => a % 2 == 0)
.OrderBy(r => r);
数据和最终格式化的方法
public static void FormatLoans<TObject>(
Func<TObject> instance,
Func<TObject, IEnumerable<decimal>> function)
{
// This is the function object but should be IEnumerable<decimal> result passed down.
// Just like TObject is passed , but how?
Console.WriteLine(string.Join(" - ",function));
}
使用方法
LoanQueries.FormatLoans<LoanQueries>(() =>
new LoanQueries()
, inst => inst.LoanQueryBodied);
LoanQueries.FormatLoans<LoanQueries>(() =>
new LoanQueries()
, inst => inst.LoanQueryExpression());
我大致基于的代码
public static class Disposable
{
public static TResult Using<TDisposable, TResult>(
Func<TDisposable> factory,
Func<TDisposable, TResult> map)
where TDisposable : IDisposable
{
using (var disposable = factory())
{
return map(disposable);
}
}
}
调用的示例
var time= Disposable
.Using(
() => new WebClient(),
client => XDocument.Parse(client.DownloadString("http://time.gov/actualtime.cgi")))
.Root
.Attribute("time")
.Value;
我想像这样链接我的方法,但如果这不可能或不好的做法,我也想知道。
您需要调用 function
和 instance
使用 ()
:
Console.WriteLine(string.Join(" - ",function(instance())));
而且显然您想 return 字符串,而不是打印它,以允许链接,所以:
public static string FormatLoans<TObject>(
Func<TObject> instance,
Func<TObject, IEnumerable<decimal>> function) =>
string.Join(" - ",function(instance()));
不过,我觉得你真的是over-complicating/over-generalising这个。您的方法不像您展示的 Disposable.Using
方法那样通用。您的方法可以这样声明:
public static string FormatLoans(IEnumerable<decimal> loans) =>
string.Join(" - ", loans);
来电者:
LoanQueries.FormatLoans(new LoanQueries().LoanQueryBodied)
LoanQueries.FormatLoans(new LoanQueries().LoanQueryExpression)
Disposable.Using
使用委托,因为它试图重新创建 using
statement。第二个参数必须在 using
语句内进行计算,这样抛出的任何异常都会导致 IDisposable
的处理,这就是为什么必须将其包装在委托中的原因。如果不是,第二个参数将在 Using
方法运行之前被评估,并且错过了整个要点。
但是,您的方法没有那样的特殊要求,因此您不需要委托。