C# 需要返回某些内容的void方法

C# 需要返回某些内容的void方法,c#,linq-to-sql,C#,Linq To Sql,我的代码中有一个方法,它必须有一个void返回类型,并且只能接受一个特定的参数。我需要从中归还一些东西 我有一个WCF服务,可以访问SQL server。它有一个名为SQLMetal.exe的程序生成的代码。这给了我一个带有分部方法的分部类DataContext。我正在构建这个分部类的另一部分,这些分部方法类似于“InsertUser”或“DeleteUser”。它们没有在分部类的其他部分实现,但我想这意味着我必须实现它们。这很好,但是如果它们是分部方法,它们必须有一个void返回类型 那么,如

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

我有一个WCF服务,可以访问SQL server。它有一个名为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服务上抛出一个,我不认为应用程序会得到它,我可能是错的。应用程序使用服务,但我认为在服务上抛出异常不会到达使用服务的应用程序。会吗

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


再次感谢。

我希望您在这种情况下抛出一个异常,通知客户出了问题:

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

您可以将想要返回的参数作为ref

 void DoSomethingOnService(ref object value);

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

public class Foo
{
   string _result;

   void DoSomething(string param1)
   {
      _result = param1;
   }
}

您不会从void方法返回任何内容。调用代码不会期望您这样做,如果您以某种方式这样做了,也不会知道该如何处理它

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

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

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


这就是例外。如果出现错误,抛出异常。

您提到的这些局部方法旨在允许您连接到LinqSql的内部工作-它们实际上不应该成为数据访问层的公共API。您可以在DataContext类中添加您喜欢的任何其他公共方法,而不受签名限制——尽管我建议您查看

编辑以回应评论

下面是一个简单存储库实现的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);
        }
    }
}

希望这能引起您的思考:

您不能更改生成的代码吗?您能更具体一点吗?显示一些代码?现在你的问题没有多大意义…如果你有一个方法需要返回一些东西,那么它不可能是空的。简单的解决方案是不使用代码生成器。@Ramhound这不是一个真正简单的解决方案。最简单的解决方案是更好地理解代码生成器,而不是在我们第一次误解如何正确使用它时就放弃它……这当然是一个有效的建议。我们必须假设我们不能改变部分方法。当然不存在分部方法这类东西,因此此投诉是无效的。我相信分部方法不支持out参数,但它们支持ref,如果他不能更改方法,则这没有帮助。+1您不应该在WCF服务中执行任何DB-wise操作,甚至直接调用ORM,把这些都放在另一个库/层后面。@Mark W同意,但在我写这个答案时没有提到WCF服务。我明白了。。。所以我应该把这一切连接到其他东西后面,而其他东西就是用来与服务器接口的。我想我甚至不能实现这些方法。这可能更容易。好的,谢谢你抽出时间来帮我。我以后会给你投票的。还不行,名声不够好。