一个需要返回一些东西的void方法

本文关键字:void 方法 一个 返回 | 更新日期: 2023-09-27 18:17:38

我有一个方法在我的代码必须有一个void返回类型,它必须只接受一个单一的,特定的参数。我需要从中返回一些东西。

给你的细节:我有一个WCF服务上有SQL服务器访问。它的代码由一个名为SQLMetal.exe的程序生成。这给了我一个带有部分方法的部分类(DataContext)。我正在构建这个部分类的另一部分,这些部分功能是像InsertUser或DeleteUser这样的东西。它们没有在部分类的其他部分实现,但我想这意味着我必须实现它们。这很好,但是如果它们是分部方法,它们必须有一个void返回类型。

如果我想从其中一个返回什么呢?我的意思是,一个应用程序可以连接到这个服务,并可以使用它来访问数据库信息。该应用程序将需要知道服务端是否有错误。

所以它是一个带有void返回类型和一组预定义参数的分部方法。

该怎么办?

编辑:更多细节!

首先,为什么我不能更改生成的代码?这是个好建议,但我有点担心。生成它的原因是为了尽量减少未来的编码问题,如果数据库发生变化,你必须重新生成代码。

其次,一些代码:
[System.Data.Linq.Mapping.DatabaseAttribute(Name = "HVD01")]
public partial class HydraDataContext : System.Data.Linq.DataContext
{

    private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();

    #region Extensibility Method Definitions
    partial void OnCreated();
    partial void InsertClient(Client instance);
    partial void UpdateClient(Client instance);

这就是生成代码的相关部分

那是我的部分。这是在与生成的部分类结合的另一个部分类中。

public void UpdateClient(Client client)
    {
        //Primary key can't be zero
        if (client.ClientID == 0)
            return;

        dc.Clients.Attach(client, true);
        dc.SubmitChanges();
    }

显然有潜在的东西需要返回。

异常呢?好吧,如果我在WCF服务上抛出一个,我认为应用程序不会得到它(我可能在这里错了)。应用程序消费服务,但我不认为在服务上抛出异常会到达消费应用程序。会吗?

也许仅仅改变函数是最好的。我只是认为,关键在于尽可能多地保留生成的代码,以防需要重新生成它。

再次感谢。

一个需要返回一些东西的void方法

您不会从void方法返回任何内容。调用代码的人不会期望你这样做,而且即使你这样做了,他们也不知道该怎么做。

这很好,但是如果它们是部分方法,它们必须有一个void返回类型。

为什么它们是部分方法?如果它们在生成的代码中不存在,那么你可以在你的部分类中定义它们。如果它们确实存在,不要试图改变它们的足迹,否则你会破坏一些东西。

应用程序需要知道服务端是否有错误。

这就是异常的作用。如果有错误,抛出异常

我希望您在这种情况下抛出一个异常来通知客户端出错了:

throw new Exception("I do not believe that parameter means what you think it means");

你可以把你想要返回的参数作为ref。

 void DoSomethingOnService(ref object value);

你提到的这些局部方法被设计成允许你钩入LinqSql的内部工作——它们实际上不应该成为你的数据访问层的公共API。您可以在DataContext类中添加任何其他您喜欢的公共方法(没有签名限制)——尽管我建议您查看Repository Pattern。

编辑回复评论

这是一个简单的存储库实现的psuedo示例,它可以作为DataContext的公共包装器,并且可以返回关于您在帖子中描述的操作结果的上下文信息。

public class ClientRepository
{
    public ClientRepository()
    {
        this.DataContext = new HydraDataContext();
    }
    private HydraDataConetxt DataContext { get; set; }
    // DBResult is a made up class which returns some info about the operation...
    public DBResult Insert(Client client)
    {
        try
        {
            this.DataContext.Clients.InsertOnSubmit(client);
            this.DataContext.SubmitChanges();
             return DBResult.Success;
        }
        catch (Exception error)
        {
             return DBResult.Failed(error.Message);
        }
    }
}

希望能给你一些启发。

为什么不直接使用类成员呢?

public class Foo
{
   string _result;
   void DoSomething(string param1)
   {
      _result = param1;
   }
}