通过ref传递给另一个方法的引用类型不会返回更新的值

时间:2011-10-28 00:27:14

标签: c# workflow-foundation-4 ref reference-type

我面临以下问题:

我需要从我的控制器拨打我的域层;它调用通过引用(ref)接收请求的Web服务方法。

控制器代码:

//BusinessEntityObject is a Reference-Type (BusinessEntity) object
var request = View.BusinessEntityObject; 
_workflowService.PerformAction(request);
if(request.Errors.Count != 0)
{
    View.Errors = request.Errors;
    return false;
}

域层(WorkflowService.cs类):

public void PerformAction(BusinessEntity request)
{
    //TryAction(System.Action action) basically wraps action in try catch and handles exceptions 
    TryAction(() =>
             {
                 _wcfClient.RequestSomething(ref request);
             });
}

IF _wcfClient.RequestSomething在返回时修改Errors集合,请求对象具有此错误更新错误集合。然而,一旦控制返回到控制器&检查错误集合,然后我的更新消失了。

Edit00:哦,无耻的插件,我在14号代表,我试图提出一些对我有用的问题/答案,它说我不能因为我的水平很低。< / p>

Edit01:非常感谢Dylan,看到总是很高兴有一个这样的网站指出可能错过的非常小的东西。将值返回给我的更新代码如下所示:

域层(WorkflowService.cs类):

public BusinessEntity PerformAction(BusinessEntity request)
{
    //TryAction(System.Action action) basically wraps action in try catch and handles exceptions 
    TryAction(() =>
             {
                 _wcfClient.RequestSomething(ref request);
                 return request;
             });
}

2 个答案:

答案 0 :(得分:3)

当您将对象传递给WCF服务时,它会被序列化,通过网络发送,然后在服务器上反序列化。在这种情况下,“通过引用”传递它不会改变任何内容,如果服务器对其进行更改,则不会将其发送回调用者。只有WCF调用的返回值被序列化并发回。

我建议,如果你需要WCF服务来返回任何数据,你将它打包成返回值。

答案 1 :(得分:0)

您的ref方法错过了PerformAction修饰符。

public void PerformAction(ref BusinessEntity request)
{
    TryAction(() => _wcfClient.RequestSomething(ref request));
}

但是,进行此更改将阻止您的代码编译。您将收到以下错误:

  

无法在匿名方法中使用ref或out参数'request',   lambda表达式或查询表达式

你必须做这样的事情才能让它发挥作用:

public void PerformAction(ref BusinessEntity request)
{
    var r = request;
    TryAction(() => _wcfClient.RequestSomething(ref r));
    request = r;
}

通过引用传递请求似乎有点不稳定。最好返回一个新的(或相同的)实例并在外层执行赋值。