以 .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}"));