访问动作的输出参数
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;}
}
假设出于任何奇怪的原因(互操作实际上)我有这个方法
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;}
}