【问题标题】:Create an object inside another class C#?在另一个类 C# 中创建一个对象?
【发布时间】:2011-06-07 19:25:18
【问题描述】:

我正在向 oop 迈出第一步,这需要对我的应用程序进行彻底改造,并将其全部重新设计为 3 层和面向对象的。 叹息。我有一个提交对象,它应该包含一个客户对象(以及一个代理和覆盖对象);我想将数据库中的一些数据读取器结果存储在每个包含对象的字段中,但是当我尝试使用新的提交对象调用 Customer 对象时,我什么也得不到。 VS 无法识别 Submission 包含 Customer 对象。我显然错过了一些关键点,所以考虑到这一点,想法?代码如下。

//This is the Submission class here
public class Submission 
{
    public int SubmissionId {get;set;}
    public int Status { get; set; }
    public string StatusComment { get; set; }


    public class Customer
    {
        //public Customer() { }
        public int CustId { get; set; }
        public string CustName { get; set; }
        public string CustAddress { get; set; }
        public string CustState { get; set; }
        public string CustCity { get; set; }
        public int CustZip { get; set; }
        public int SicNaic { get; set; }

    }

    public object Customer();
}


//These lines throw an error:

无法通过表达式引用类型。 VS 无法识别 TempSubmission.Customer 中对 Customer 对象的调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;


/// This query should selects the relevant data for a gridview on the presentation layer and stores in a list. 
/// Don't quite know how to bind it to the gridview yet, but that's a different question. 

public class SubmissionDatabaseService
{
    public List<Submission> GetAllSubmissions()
    {
        string Searchstring = "SELECT Submission.SubmissionId, Customer.CustName, Customer.CustCity, Customer.CustState, Broker.BroName, Broker.BroState, Broker.EntityType, Submission.Coverage, Status.Status FROM Submission INNER JOIN Broker ON Broker.BroId = Submission.BroId INNER JOIN Customer ON Customer.CustId = Submission.CustId INNER JOIN Status ON Status.StatusId = Submission.StatusId";
        string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;        
        SqlConnection conn = new SqlConnection(connectionString);

        SqlDataReader dr = null;

        try
        {
            conn.Open();

            SqlCommand Searchcmd = new SqlCommand(Searchstring, conn);

            dr = Searchcmd.ExecuteReader();
            List <Submission> lstSubmission;
            Submission tempSubmission;
            while (dr.Read())
            {
                tempSubmission = new Submission();
                tempSubmission.SubmissionId = dr.GetInt32(0);
                tempSubmission.Customer.CustName = dr.GetString(1);
                tempSubmission.Customer.CustCity = dr.GetString(2);
                tempSubmission.Customer.CustState = dr.GetString(3);
                tempSubmission.Broker.BroName = dr.GetString(4);
                tempSubmission.Broker.BroState = dr.GetString(5);
                tempSubmission.Broker.EntityType = dr.GetString(6);
                tempSubmission.SubmissionCoverage.Coverage = dr.GetInt32(7);
                tempSubmission.Status = dr.GetInt32(8);

                //Add rest of the fields
                lstSubmission.Add(tempSubmission);
            }
        }

        return lstSubmission;
    }
}

【问题讨论】:

  • 尝试将 using 声明移到顶部
  • 目前您已将 Customer 定义为 Submission 的内部类,这不是我认为您想要的。您希望客户与提交一起成为顶级类,而不是让提交持有对客户实例的引用。

标签: c# sql-server visual-studio ado.net


【解决方案1】:

哦.. 从哪里开始?将您的 Customer 类放在它自己的文件 Customer.cs 中,将您的 Submission 类放在它自己的文件 Submission.cs 中

然后你可以像这样做一个简单的提交类:

public class Submission 
{
        // consider implementing the below as properties to more finely control access
        public int SubmissionId;
        public int Status;
        public string StatusComment;
        public Customer SubmissionCustomer; // <-- this is null until you set it to a Customer object, either in the constructor or externally.

        public Submission() {
          // constructor
        }

}

然后阅读属性和构造函数,并按照您认为合适的方式将它们添加进去。见:

http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx

属性具有私有/公共模式。至于构造函数:

见:

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx

每当您创建类的实例(对象)时,都会调用构造函数。

【讨论】:

  • 您将成员添加为公共字段,属性可能是更好的选择。
  • 同意,只是想保持简单的开始;) Brazos - 使用属性。
  • 谢谢,@Mikey。这正是我所需要的。那里有这么多信息,当你不知道正确的问题时,很难找到正确的东西,你知道吗?
  • 没问题。旧约。但是我在为我正在修理的一辆旧车寻找“变速带”时遇到了类似的问题。谁知道它叫那个? Stack Overflow 是一个很好的资源,我将启动 Spring 框架并计划在此过程中提出很多问题!
  • 您可以通过创建私有变量然后右键单击它并选择 Refactor -> Encapsulate Field 来使用 VS 自动创建属性。享受吧。
【解决方案2】:

我认为您希望 Customer 类位于 Submission 类之外,并且 Submission 类包含 Customer 的实例。

public class Submission
{
    public Submission()
    {
        this.Customer = new Customer();
    }

    public int SubmissionId { get; set; }
    public int Status { get; set; }
    public string StatusComment { get; set; }
    public Customer Customer { get; set; }
}
public class Customer
{
    //public Customer() { }
    public int CustId { get; set; }
    public string CustName { get; set; }
    public string CustAddress { get; set; }
    public string CustState { get; set; }
    public string CustCity { get; set; }
    public int CustZip { get; set; }
    public int SicNaic { get; set; }
}

【讨论】:

    【解决方案3】:

    仅在 Submission 中定义 Customer 对象不会使 Submission 包含 Customer 的实例。对于您想要做的事情,只需将 Customer 带到 Submission 之外并在 Submission 中定义一个 Customer 属性。

    【讨论】:

      【解决方案4】:

      您正在尝试通过tempSubmission 引用实际类型Customer。您必须改为引用 Customer 的实例,该实例将通过属性或类似的方式公开。

      【讨论】:

        【解决方案5】:

        问题是您的客户类型不够具体,它被定义为对象而不是客户。

        要实现您想要做的事情,在这种情况下,您必须向您的Submission 类添加一个Customer 类型的新成员,您对public object Customer(); 所做的基本上是meams,定义一个名为@ 的方法对象类型的987654324@。

        您想要做的是定义一个 Customer 类型的属性,例如 RelatedCustomer

        Public Customer RelatedCustomer{get;set;}
        

        【讨论】:

          猜你喜欢
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 2019-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多