如何从泛型函数中记录参数[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从泛型函数中记录参数[重复]相关的知识,希望对你有一定的参考价值。

给出以下代码:

int result = Execute(() => Foo(1, 2));

public int Foo(int x, int y)
{
    return x + y;
}

public T Execute<T>(
    Func<T> function)
{
    Console.Write(function.Method.Name + ": " + string.Join(", ", params));
    return function();
}

有可能获得参数吗?所以输出会读取如下内容:

“Foo:1,2”

答案

是的你可以。使用表达式树。但请注意,它并未涵盖所有情况(LINQ等链式调用)。它总是可以安排覆盖那些情况,但这种方法将变成巨大的垃圾堆:

class Program
{
    static void Main(string[] args)
    {
        int result = Execute(() => Foo(1, 2));
    }

    public static int Foo(int x, int y)
    {
        return x + y;
    }

    public static T Execute<T>(Expression<Func<T>> function)
    {
        var call = function.Body as MethodCallExpression;
        var values = new List<object>();
        var obj = call.Object == null ? null : Expression.Lambda(call.Object).Compile().DynamicInvoke();
        foreach (var arg in call.Arguments)
        {
            var value = Expression.Lambda(arg).Compile().DynamicInvoke();
            values.Add(value);
        }
        LogMethodCall(call.Method.Name, values);
        return (T)call.Method.Invoke(obj, values.ToArray());
    }

    public static void LogMethodCall(string methodName, IEnumerable<object> args)
    {
        Console.WriteLine("{0}: {1}", methodName, string.Join(",",args.Select(x=> x.ToString())));
    }
}

它会打印出来:

Foo:1,2

您还可以在此示例中记录invokation的输出和对象。

以上是关于如何从泛型函数中记录参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从泛型函数返回 null? [复制]

从泛型类型快速实例化

从泛型类型 T 中获取“类”对象

在 C# 4.0 中,是不是可以从泛型类型参数派生类?

如何从泛型observable订阅PublishRelay?

Scala - 从泛型类型获取类对象