【问题标题】:Method with return type as object返回类型为对象的方法
【发布时间】:2018-03-03 02:08:47
【问题描述】:

我尝试了这个(https://stackoverflow.com/a/14172067/7482204) 方法,但我似乎无法弄清楚如何使用类名作为返回类型来调用该方法。

Item.cs:

class Item
{
    public Item GetItem(string parameter) 
    {
        Item itemObj = new Item();

        string query = "select * from items where model = @model";
        try
        {
            using (MySqlConnection connection = Connection.GetConnection()) 
            {
                using (MySqlCommand cmd = new MySqlCommand(query,connection)) 
                {
                    cmd.Parameters.AddWithValue("@model",parameter);
                    using (MySqlDataReader reader = cmd.ExecuteReader()) 
                    {
                        while (reader.Read()) 
                        {
                            itemObj.Id = int.Parse(reader["id"].ToString());
                            itemObj.Model = reader["model"].ToString();
                            itemObj.Brand = reader["brand"].ToString();
                            itemObj.CategoryId = int.Parse(reader["category_id"].ToString());
                            itemObj.SubCategoryId = int.Parse(reader["sub_category_id"].ToString());
                            itemObj.HasSerialNumber = (int.Parse(reader["serialized"].ToString()) == 1 ? true : false);
                        }
                    }
                }
            }
        }
        catch (Exception ex) 
        {
            throw new ArgumentException(ex.Message);
        }
        //Console.WriteLine("End"+itemObj.Model);
        return itemObj;
    }
}

然后我尝试访问 GetItem 方法

Item itemObj = GetItem("params");

但我遇到错误“然后名称 GetItem 在当前上下文中不存在”

【问题讨论】:

  • throw new ArgumentException(ex.Message); 是一个非常糟糕的主意。你不会知道那里到底发生了什么
  • 另外,(int.Parse(reader["serialized"].ToString()) == 1 ? true : false); 也可以是:reader["serialized"].ToString() == "1";

标签: c# oop


【解决方案1】:

将 GetItem 更改为静态,然后您应该可以将其称为

Item item = Item.GetItem("params")

在相关说明中,根据单一责任主体 (SRP),类 Item 不应对其持久性负责。所以你最好把它分成 2 个类,Item 和 ItemsRepository 或类似的。然后您应该能够创建存储库的实例并在该实例上调用 GetItem(不带static

class ItemsRepository
{
    public Item GetItem(string params)
    {
         ....
    }
}


 var repo = new ItemsRepo();
 var item = repo.GetItem("params");

【讨论】:

  • 我按照您的建议创建了另一个类并将 GetItem 方法放在 ItemCreator 上并创建了一个实例 ItemCreator itemCreatorObj = GetItem(params) 但它不起作用,getItem 仍然需要是静态的..then创建 Item 的对象 itemObj = ItemCreator.GetItem(),并且 ItemCreator 扩展了 Item 类,以便我可以访问 Item 属性。
【解决方案2】:

GetItem 是一个实例方法,这意味着您需要已经有一个可用的项目实例,然后在其上调用yourItem.GetItem("params")。听起来您只想将 GetItem 设置为静态方法,以便您可以在任何项目实例之外访问它,如下所示:Item yourItem = Item.GetItem("params")。为此,请将public Item GetItem(string parameter) 更改为public static Item GetItem(string parameter)。将您的数据访问和映射逻辑直接捆绑到您的项目模型中绝对值得重新考虑,但这是您没有提出的另一个问题。

【讨论】:

  • " 将您的数据访问和映射逻辑直接捆绑到您的项目模型中绝对值得重新考虑,但这是您没有问的另一个问题。" .正如 Zdravko Danev 所说,我必须有 2 个类,一个用于 Item 属性,一个用于逻辑。
猜你喜欢
  • 2012-05-04
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
相关资源
最近更新 更多