Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在操作中使用params还是Func委托?_C#_Delegates_Action_Params Keyword - Fatal编程技术网

C# 我可以在操作中使用params还是Func委托?

C# 我可以在操作中使用params还是Func委托?,c#,delegates,action,params-keyword,C#,Delegates,Action,Params Keyword,当我试图在动作委托中使用参数时 private Action<string, params object[]> WriteToLogCallBack; 私有操作writeLogCallback; 我收到此设计时错误: 类、结构或接口成员声明中的令牌“params”无效 任何帮助 这个变通方法怎么样 private Action<string, object[]> writeToLogCallBack; public void WriteToLogCallBack(st

当我试图在动作委托中使用参数时

private Action<string, params object[]> WriteToLogCallBack;
私有操作writeLogCallback;
我收到此设计时错误:

类、结构或接口成员声明中的令牌“params”无效


任何帮助

这个变通方法怎么样

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

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

可变类型参数在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));
public委托T参数操作(参数对象[]oArgs);
公共静态T LogAction(字符串s,参数oCallback)
{
日志;
T结果=oCallback();
返回T;
}
Foo-Foo=LogAction(“你好,世界”,aoArgs=>GetFoo(1,“,”,1.1));

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


params不是一个类型,即您可以在类型定义中使用
ref
?不确定它与泛型(相对于模板)的工作情况如何。如何使用lambda来调用它?这是一种非常好的方法。。。干得好,布莱恩,这里有一段很棒的代码。我在下面为上述代码添加了一个小的扩展,以展示如何包装多个方法调用。我使用它将包含数据库调用的多个方法包装到单个事务中。谢谢Bryan:-)这是不是应该返回结果而不是T?如果你不能做
LogAction(“你好,世界。”,(p1,p2,p3)=>GetFoo(p1,p2,p3)),这有什么意义???减少。。。。
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));
//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