C#方法执行给定方法

5
我想写一个方法"A",它将另一个方法"B"作为参数以及该方法B的未知数量的参数(params object[] args)。现在,在方法A中,我想用参数args调用B。 B现在将返回一个对象,我也希望A返回这个对象。
这听起来有些奇怪,因此我将添加一些示例代码:
public object A(Func<object> B, params object[] args)
{
    object x = B.Method.Invoke(args);

    return x;
}

问题在于,Func并不像那样工作。有人知道如何解决这个问题吗?
问候, Christian

如果您只传递一些定义好的参数,例如如果您定义Func接受一个整数和一个字符串,那么您的代码是否有效?我认为您的代码几乎没问题,不确定Func是否可以被定义为接受params... - Davide Piras
是的,如果我定义参数,它就能正常工作。然而,它不接受像 Func<params object[], object> B 这样的东西。 - Christian
1
b是一个固定的签名吗?你知道B返回和接受什么类型吗?如果不知道,那么就不能使用任何Func<..>签名。你必须使用Delegate和动态调用。http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx - davidfowl
B是完全未知的。它将返回一些未知的内容,并且它需要一个未知类型的未知数量的参数。我会看一下那篇文章,谢谢! - Christian
dfowler是正确的。这正是框架使用的解决方案,例如在ISynchronizeInvoke.Invoke方法中。http://msdn.microsoft.com/en-us/library/system.componentmodel.isynchronizeinvoke.invoke.aspx - Ani
4个回答

3

Func<object>是一个委托,用于表示一个不带参数且返回类型为object的方法。如果将其改为Func<object,object>,则该方法将接受一个参数并返回一个对象:

public object A(Func<object, object> B, params object[] args)
{
    object x = B(args);

    return x;
}

问题在于B可能会需要超过一个参数。 - Christian
@Christian:由于数组也是一个“对象”,所以你可以将几乎任何东西传递给Func<object, object>。然后由被调用的方法来确定它实际上得到了什么。因此,在您的情况下,使用params object [] args,您可以将args传递给Func<object, object> - Fredrik Mörk

3
void Main()
{
    Func<int> m1=()=>1;
    Console.WriteLine(A(m1));

    Func<int,int> m2=i=>i;
    Console.WriteLine(A(m2,55));
}

object A(Delegate B,params object[] args)
{

    return B.Method.Invoke(B.Target,args);
}

...告别类型安全


这个可以完成任务。谢谢!嗯,你说得对,类型安全性消失了,但在我的情况下没有其他方法可以做到。 - Christian

1

这应该可以:

public object A(Func<object[], object> B, params object[] args) 
{     
     object x = B(args);     
     return x; 
}

如果我的所有B都以对象数组作为参数,那么这将起作用。我可以使用这个,但是最好让B函数保持原样。 - Christian

1

你应该有像这样的代码:

public object A(Func<object[], object> B, params object[] args)
{
    object x = B(args);

    return x;
}

你忽略了 Func 重载需要接受你的对象数组参数。

无论如何,如果你需要这个方法“A”接受不带参数的函数,你应该创建一个不带参数的函数参数重载版本的“A”。


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