2011-01-24 98 views
5

我正在尝试编写以下内容:我想编写一个方法“A”,该方法需要另一个方法“B”以及此方法的参数数量未知。 (params object [] args)。现在,在方法A中,我想用参数args调用B。 B现在将返回一个我希望A返回的对象。C#执行给定方法的方法

这一切听起来有点怪怪的,所以我会添加一些示例代码:

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

    return x; 
} 

的问题是,Func键不喜欢的工作。有没有人知道这样做的方式?

问候, 基督教

+0

请问,如果你只传递一些定义的参数,例如,如果你定义Func键接受一个整数,字符串代码的工作?我认为你的代码几乎没问题,不知道Func是否可以定义为接受参数... – 2011-01-24 10:25:27

+0

是的,如果我定义参数,它确实有效。但它不接受类似Func B。 – Christian 2011-01-24 10:27:05

+1

是b是固定签名吗?你知道B型返回并需要什么吗?如果没有,那么你不能使用任何Func <..>签名。你将不得不使用委托和动态调用。 http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx – davidfowl 2011-01-24 10:31:25

回答

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); 
} 

...再见类型安全

1

这应做到:

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

Func<object>是,它没有参数和返回object的方法的委托。如果您将其更改为Func<object,object>,这将需要一个参数和返回对象:

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

    return x; 
} 
1

你应该有类似这样的代码:

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

    return x; 
} 

你错过了Func键超负荷需要接受你的参数数组。无论如何,如果您需要此方法“A”来接受无参数函数,您应该创建一个无参数函数参数“A”的超载。