以 .Select 的方式创建 LINQ 中间变量
Create LINQ intermediate variable the way .Select it does
我创建了以下扩展:
public static class StackTraceExtensions
{
public static string Callers(this StackTrace trace)
{
return string.Join(" < ", trace.GetFrames().Select(sf => sf.GetMethod().DeclaringType.Name + "." + sf.GetMethod().Name));
}
}
但每次都调用 GetMethod()
并不是一个好的解决方案。我正在寻找一些方法来创建一个中间变量,就像 LINQ .Select
函数那样。
.Select
仅适用于 IEnumerable
并且适用于多个值,因此我开发了另一个扩展,这次适用于任何对象:
public static class ObjectExtensions
{
public static TResult Self<TSource, TResult>(this TSource source, Func<TSource, TResult> selector) => selector(source);
}
此扩展可以按如下方式使用:
public static class StackTraceExtensions
{
public static string Callers(this StackTrace trace)
{
return string.Join(" < ", trace.GetFrames().Select(sf => sf.GetMethod().Self(mb => $"{mb.DeclaringType.Name}.{mb.Name}")));
}
}
它允许我在这里处理中间mb
“变量”。
是否有一些标准扩展可以实现相同功能,这样我就不需要创建自己的扩展了?
您可以先select该方法,然后在随后的Select
:
中使用它
return string.Join(" < ", trace.GetFrames()
.Select(sf => sf.GetMethod())
.Select(m => $"{m.DeclaringType.Name}.{m.Name}"));
我创建了以下扩展:
public static class StackTraceExtensions
{
public static string Callers(this StackTrace trace)
{
return string.Join(" < ", trace.GetFrames().Select(sf => sf.GetMethod().DeclaringType.Name + "." + sf.GetMethod().Name));
}
}
但每次都调用 GetMethod()
并不是一个好的解决方案。我正在寻找一些方法来创建一个中间变量,就像 LINQ .Select
函数那样。
.Select
仅适用于 IEnumerable
并且适用于多个值,因此我开发了另一个扩展,这次适用于任何对象:
public static class ObjectExtensions
{
public static TResult Self<TSource, TResult>(this TSource source, Func<TSource, TResult> selector) => selector(source);
}
此扩展可以按如下方式使用:
public static class StackTraceExtensions
{
public static string Callers(this StackTrace trace)
{
return string.Join(" < ", trace.GetFrames().Select(sf => sf.GetMethod().Self(mb => $"{mb.DeclaringType.Name}.{mb.Name}")));
}
}
它允许我在这里处理中间mb
“变量”。
是否有一些标准扩展可以实现相同功能,这样我就不需要创建自己的扩展了?
您可以先select该方法,然后在随后的Select
:
return string.Join(" < ", trace.GetFrames()
.Select(sf => sf.GetMethod())
.Select(m => $"{m.DeclaringType.Name}.{m.Name}"));