访问动作的输出参数

Access action's out parameter

假设出于任何奇怪的原因(互操作实际上)我有这个方法

void DoSomething(out MyStruct myStruct)
{
    // Setting the struct members here.
}

我想传递给另一个看起来像这样的方法:

ExecuteAndProcess(Action action)
{
    action();
    // How can I access the out parameter here?
}

问题是我不知道如何访问out参数;我试图将 ExecuteAndProcess 的定义更改为

ExecuteAndProcess(Action action, ref MyStruct myStructParam) 
{ 
    action();
    var member = myStructParam.Property1;
    // ...
}

这样我就可以这样调用它,希望 myStructParam 参数能够反映 myStruct 变量的变化

MyStruct myStruct = default;
ExecuteAndProcess(() => DoSomething(out myStruct), ref myStructParam);

但事实并非如此。


有什么方法可以 执行操作并访问 ExecuteAndProcess 方法中的 out 参数?

遗憾的是,我无法简单地将 DoSomething 设为 return 结构,而不是将其作为 out 参数传递,因为它的实现是在非托管代码中。

您不能对 Action 类型执行此操作,因为没有包含 out 参数的 Action 类型。但是您可以创建自己的委托类型并改用它:

void Main()
{
    ExecuteAndProcess(DoSomething);
}

void ExecuteAndProcess(MyAction action)
{
    MyStruct myStruct;
    action(out myStruct);
    // access the out parameter here
    Console.WriteLine(myStruct.A);
}

delegate void MyAction(out MyStruct myStruct);

void DoSomething(out MyStruct myStruct)
{
    // Setting the struct members here.
    myStruct = new MyStruct{A = 1};
}

public struct MyStruct{
    public int A{get;set;}
}