繁体   English   中英

我可以在Action或Func委托中使用params吗?

[英]Can I use params in Action or Func delegates?

当我试图在Action委托中使用params时......

private Action<string, params object[]> WriteToLogCallBack;

我收到了这个设计时错误:

类,结构或接口成员声明中的标记'params'无效

任何帮助!

这个解决方法怎么样?

private Action<string, object[]> writeToLogCallBack;
public void WriteToLogCallBack(string s, params object[] args)
{
  if(writeToLogCallBack!=null)
    writeToLogCallBack(s,args);
}

或者您可以定义自己的委托类型:

delegate void LogAction(string s, params object[] args);

C#中无法使用变量类型参数。

这就是为什么有很多Action<...>Func<...>Tuple<...> 不过,这将是一个有趣的功能。 C ++ 0x 有它们

你可以试试这个。 它允许任意数量的参数,如果传递错误的数字或类型的参数,您将得到编译时错误。

public delegate T ParamsAction<T>(params object[] oArgs);

public static T LogAction<T>(string s, ParamsAction<T> oCallback)
{
    Log(s);
    T result = oCallback();
    return T;
}

Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1));

您可以在委托的实际声明中使用params ,但不能在一个类型中使用params Action的泛型参数只是类型,而不是调用委托时要传递的实际参数。 params不是一个类型,它是一个关键字。

我对Bryan的上述代码做了一个小的扩展,以展示如何包装多个方法调用。
我使用它将包含数据库调用的多个方法包装到单个事务中。
谢谢布莱恩:-)
(您可以在LINQPad中运行以下命令进行测试)

//Wrapper code
public delegate void MyAction(params object[] objArgs);
public static void RunActions(params MyAction[] actnArgs)
{
    Console.WriteLine("WrapperBefore: Begin transaction code\n");
    actnArgs.ToList().ForEach( actn =>  actn() );
    Console.WriteLine("\nWrapperAfter: Commit transaction code");
}

//Methods being called
public void Hash  (string s, int i, int j)  => Console.WriteLine("   Hash-method call: " + s + "###" + i.ToString() + j.ToString());
public void Slash (int i, string s)         => Console.WriteLine("   Slash-method call: " + i.ToString()+ @"////" + s);

//Actual calling code
void Main()
{  
  RunActions( objArgs => Hash("One", 2, 1)
             ,objArgs => Slash(3, "four")   );
}

//Resulting output: 
// 
//  WrapperBefore: Begin transaction code
//  
//  Hash-method call: One###21
//  Slash-method call: 3////four
//  
//  WrapperAfter: Commit transaction code  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM