【问题标题】:Return Multiple Values C# [duplicate]返回多个值 C# [重复]
【发布时间】:2016-01-18 11:23:02
【问题描述】:

我编写了一个单独的类来保存我网站的权限。我在每节课上都会打电话给这个班级。我无法从我的权限类中取回值。我将在下面向您展示我所拥有的:

权限类

public class Permissions
{
     public static string selectedNumber = "";
     public static string selectedName= "";
     public static string selectedLocation= "";

     public Info SetInfo(string selectedValue)
    {           
        string selectInfo = "SELECT [Num] AS 'Number', [Name] AS 'Name', CONVERT(nvarchar(50),RTRIM(b.Num])) + ' - ' + CONVERT(nvarchar(50),b.Name) AS 'Location' "
            + "FROM [TBL_Info] a "
            + "left join [TBL_Where] b on (a.[ID] = b.[ID]) "
            + "WHERE a.ID = @ID";

        sqlCmd = new SqlCommand(selectInfo, sqlConn);
        sqlConn.Open();

        sqlCmd.Parameters.AddWithValue("@ID", selectedValue);

        SqlDataReader rdrInfo = sqlCmd.ExecuteReader();

        if (rdrInfo.HasRows)
        {
            rdrInfo.Read();

            selectedNumber = rdrInfo .GetSqlString(rdrInfo .GetOrdinal("Number")).ToString();
            selectedName= rdrInfo .GetSqlString(rdrInfo .GetOrdinal("Name")).ToString();
            selectedLocation = rdrInfo .GetSqlString(rdrInfo .GetOrdinal("Location")).ToString();
        }
        sqlCmd.Connection.Close();

        return new Info()
        {
           number= selectedNumber, 
           name= selectedName,
           location= selectedLocation

        };
    }

    public class Info
    {
        public String number{ get; set; }
        public String name{ get; set; }
        public String location{ get; set; }
    }
}

我目前正尝试在另一个类中调用它:

Classes.Permissions permission = new Classes.Permissions();
permission.SetInfo(selectedUserValue);

最终结果是,我在尝试使用来自 permission.SetInfo() 的 3 个返回值进行调用的类中设置了文本框

目前我无法退回任何东西......我知道我做错了什么,很明显。那么有人可以给我一些关于如何实现这一目标的建议吗?

【问题讨论】:

  • 您没有保存要返回的对象var info = permission.SetInfo(selectedUserValue); 之后您可以使用info 变量
  • 对,我明白了...但是我将如何返回这 3 个对象?在列表中?
  • 您应该在 using 块中打开 sql 连接,以便它始终关闭。
  • 如果你想返回几个Info 对象,那么集合(列表/数组等)是一个选项。如果这些对象中的每一个都有不同的含义,那么考虑创建具有Info 类型的三个属性并具有适当名称的类,并返回该对象
  • 所以让我们做对了:你获取一些信息的函数实际上被称为SetInfo?你知道这有什么问题吗?

标签: c# class return


【解决方案1】:

除了我遇到的一些风格问题之外,您的代码看起来应该可以工作(只要您的数据库中有数据)。要从一个方法返回多个值,请创建一个定义要返回的内容的新对象(即Info)。

所以,你应该能够写出类似的东西:

Textbox txtBox;

var info = new Classes.Permissions().SetInfo(SelectedUserValue);

txtBox.Text = 
       info.number ?? "<null>" + " " + 
       info.name ?? "<null> + " " + 
       info.location ?? "<null>'

请注意,我使用了空合并运算符 (??),因为 SetInfo 可以返回 Info 的实例,如果您的数据库查询没有返回任何行,则所有成员都是 null

顺便说一句,从一个方法返回多个值的另一种方法是使用out参数:

Textbox txtBox;
string number;
string name;
string location;

new Classes.Permissions().SetInfo(SelectedUserValue, out number, out name, out location);

然后你的SetInfo 看起来像:

public void SetInfo(string SeelctedUserValue, 
     out string number, out string name, out string location)
{
    //assign values to number,name and location
}

要返回同一对象的多个实例,您的方法应该返回

  1. IEnumerable(即ListArray),
  2. Tuple&lt;&gt;,
  3. 一个容器对象。

例如,如果您知道您将准确返回三个,您可能希望您的方法返回 Tuple&lt;Info,Info,Info&gt;

public Tuple<Info, Info, Info> SetInfo(string SeelctedUserValue)
{
   //query db
   return new Tuple<Info, Info, Info>(
     new Info{ number = "number", name = "name", location="location},
     new Info{ number = "number", name = "name", location="location},
     new Info{ number = "number", name = "name", location="location});         
}

【讨论】:

  • out 参数看起来更容易一些......也
  • 有几种方法可以做你想做的事。您必须决定哪个最适合您的情况和环境。
  • 我的初始方式和参数都在工作。将决定什么对我最好。非常感谢
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2011-03-09
  • 2021-03-03
  • 2011-04-19
  • 2014-01-21
相关资源
最近更新 更多