C# 将泛型函数作为参数传递

3

我正在尝试审计应用程序内的方法调用,以便对参数进行分析和剖析。我已经成功实现了这一点,

Run( ()=> SomeFunction(paramA, paramB), paramA, paramB) );

public static void Run(Expression<Action> action, params object[] param)
{
   var func = action.Compile();
   func();
}

public static T Run<T>(Expression<Func<T>> action, params object[] param)
{
   var func = action.Compile();
   return func();
}

不过我希望去掉 Lambda 表达式,让这个方法更加易用。例如:

Run(SomeFunc, paramA, paramB);

我已经到这个地方了,但现在卡住了,如果有人能帮帮我:

private T Run<T>(Func<T> subReturn) {}

你没有使用传递给Run<T>方法的param参数,这是有意为之吗? - Sergey Kalinichenko
你能详细说明一下“分析和剖析参数”的意思吗? - 1.618
3
你有多少个不同的函数,参数数量和类型有多大差异?但更值得好奇的是,为什么你认为使用Run(SomeFunc,paramA,paramB)Run(() => SomeFunc(paramA, paramB))更容易使用?正如其他人指出的那样,你不需要将参数传递两次,它们已经作为Expression<>的一部分存在,尽管你需要解析它来提取它们。 - Dylan Nicholson
您可以在此处找到有关C#拦截的一些信息:https://weblogs.asp.net/ricardoperes/interception-in-net-part-4-an-interception-framework - Amittai Shapira
通过评估表达式来提取参数,在“运行”时可以很好地避免冗余的参数。谢谢! - Sean
1个回答

3

我不太明白您想要的具体内容,但如果我理解正确,这可能会对您有所帮助:

private T Run<T, TLeft, TRight>(Func<TLeft, TRight, T> action, TLeft leftParam, TRight rightParam)
{
    return action(leftParam, rightParam);
}

3
正确的做法是:为 Func<T>Func<T1,...T16, TResult> 添加16个以上的重载,以及为 ActionAction<T1,...T16> 添加大约17个重载,这样你就可以给自己来一杯冰啤酒���而你会需要这杯啤酒。 - 15ee8f99-57ff-4f92-890c-b56153
2
使用 Func<TLeft, TRight> 意味着您会失去由 Expression<> 捕获的信息,包括函数名称等。 - Dylan Nicholson
2
说实话,我甚至不知道他想要实现什么。 - rokkerboci
1
@Sean 如果你将那个段落添加到问题中,它会变得更好。如果单词能够解释问题的重要性,那么“太冗长”这种东西是不存在的。 - 15ee8f99-57ff-4f92-890c-b56153
1
@DylanNicholson 简单的方法名称(“方法组”)不会像转换为纯委托类型一样隐式转换为 Expression<>。因此,如果你想能够执行 var r = Run(SomeMethod);,其中 SomeMethod 是 C# 方法的名称,则不能使用 Expression<> 进行操作。在这种情况下,你将被迫使用 var r = Run(() => SomeMethod()); - Jeppe Stig Nielsen
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接