C#自定义类集合混乱

mat*_*con 0 c# class

以下是我的自定义类,包含集合.我的应用程序是一个MDI应用程序,能够为多个程序多次打开"程序"表单,我想使用ProgramBudget类,但我希望程序预算中的所有"子类"都包含在Program表单ProgramBudget中类.

我有问题,但子类继续在IntelliSense中被引用(即:ProgramBudget.ParticipantTypeBudget.ParticipantTypeBudget.ParticipantTypeBudget ...)

这个类有什么问题,我如何使用它,自定义类如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IPAM_NSF_Financials.Application_Classes
{
    public class ProgramBudget
    {
        internal string strProgramCode;
        private string strActualTravelSourceRefCode;
        private string strActualExpenseSourceRefCode;
        private string strProgramBudgetComment;
        private string strParticipantComment;
        private decimal decInitTravel;
        private decimal decInitLodging;
        private decimal decInitStipend;
        private decimal decRemTravel;
        private decimal decRemLodging;
        private decimal decRemStipend;
        private decimal decPartTypeTravel;
        private decimal decPartTypeExpenses;
        private decimal decPartPrimTravelBudget;
        private decimal decPartPrimExpenseBudget;
        private decimal decPartPrimRegFee;
        private decimal decActualTravelAir;
        private decimal decActualTravelGround;
        private decimal decActualTravelMisc;
        private decimal decActualExpenseLodging;
        private decimal decActualExpenseCatering;
        private decimal decActualExpenseMisc;
        private int nProgramBudgetID;
        private int nParticipantTypeBudgetID;
        private int nParticipantBudgetHDRID;
        private int nParticipantBudgetHDRCommentID;
        private int nParticipantBudgetDTLID;
        private int nParticipantBudgetDTLExpenseID;
        private int nParticipantBudgetDTLTravelID;
        private int nPartType;
        private int nParticipant;
        private int nActualTravelSource;
        private int nActualExpenseSource;

        public int ProgramBudgetID
        {
            get { return nProgramBudgetID; }
            set { nProgramBudgetID = value; }
        }

        public string ProgramCode
        {
            get { return strProgramCode; }
            set { strProgramCode = value; }
        }

        public decimal InitialTravel
        {
            get { return decInitTravel; }
            set { decInitTravel = value; }
        }

        public decimal InitialLodging
        {
            get { return decInitLodging; }
            set { decInitLodging = value; }
        }

        public decimal InitialStipend
        {
            get { return decInitStipend; }
            set { decInitStipend = value; }
        }

        public decimal RemainingTravel
        {
            get { return decRemTravel; }
            set { decRemTravel = value; }
        }

        public decimal RemainingLodging
        {
            get { return decRemLodging; }
            set { decRemLodging = value; }
        }

        public decimal RemainingStipend
        {
            get { return decRemStipend; }
            set { decRemStipend = value; }
        }

        public string ProgramBudgetComment
        {
            get { return strProgramBudgetComment; }
            set { strProgramBudgetComment = value; }
        }

        public class ParticipantTypeBudget : ProgramBudget
        {
            public int ParticipantTypeBudgetID
            {
                get { return nParticipantTypeBudgetID; }
                set { nParticipantTypeBudgetID = value; }
            }

            public int ParticipantType
            {
                get { return nPartType; }
                set { nPartType = value; }
            }

            public decimal ParticipantTypeTravel
            {
                get { return decPartTypeTravel; }
                set { decPartTypeTravel = value; }
            }

            public decimal ParticipantTypeExpenses
            {
                get { return decPartTypeExpenses; }
                set { decPartTypeExpenses = value; }
            }
        }

        class ParticipantTypeBudgets : CollectionBase
        {
            public void Add(ParticipantTypeBudget partTypeBudgetObject)
            { InnerList.Add(partTypeBudgetObject); }

            public void Remove(int Index)
            { InnerList.RemoveAt(Index); }

            public ParticipantTypeBudget Item(int Index)
            { return (ParticipantTypeBudget)InnerList[Index]; }
        }

        public class ParticipantPrimaryBudget : ProgramBudget
        {
            public int ParticipantBudgetHDRID
            {
                get { return nParticipantBudgetHDRID; }
                set { nParticipantBudgetHDRID = value; }
            }

            public int ParticipantID
            {
                get { return nParticipant; }
                set { nParticipant = value; }
            }

            public string ParticipantBudgetComment
            {
                get { return strParticipantComment; }
                set { strParticipantComment = value; }
            }

            public decimal ParticipantPrimaryTravelBudget
            {
                get { return decPartPrimTravelBudget; }
                set { decPartPrimTravelBudget = value; }
            }

            public decimal ParticipantPrimaryExpenseBudget
            {
                get { return decPartPrimExpenseBudget; }
                set { decPartPrimExpenseBudget = value; }
            }

            public decimal ParticipantPrimaryRegFee
            {
                get { return decPartPrimRegFee; }
                set { decPartPrimRegFee = value; }
            }
        }

        public class ParticipantActualTravelBudget : ProgramBudget
        {
            public int ParticipantBudgetDTLID
            {
                get { return nParticipantBudgetDTLID; }
                set { nParticipantBudgetDTLID = value; }
            }

            public int ParticipantBudgetDTLTravelID
            {
                get { return nParticipantBudgetDTLTravelID; }
                set { nParticipantBudgetDTLTravelID = value; }
            }

            public int FundingSource
            {
                get { return nActualTravelSource; }
                set { nActualTravelSource = value; }
            }

            public string ReferenceCode
            {
                get { return strActualTravelSourceRefCode; }
                set { strActualTravelSourceRefCode = value; }
            }

            public decimal Air
            {
                get { return decActualTravelAir; }
                set { decActualTravelAir = value; }
            }

            public decimal Ground
            {
                get { return decActualTravelGround; }
                set { decActualTravelGround = value; }
            }

            public decimal Miscellaneous
            {
                get { return decActualTravelMisc; }
                set { decActualTravelMisc = value; }
            }
        }

        class ParticipantActualTravelBudgets : CollectionBase
        {
            public void Add(ParticipantActualTravelBudget partActTravelBudgetObject)
            { InnerList.Add(partActTravelBudgetObject); }

            public void RemoveAt(int Index)
            { InnerList.RemoveAt(Index); }

            public ParticipantActualTravelBudget Item(int Index)
            { return (ParticipantActualTravelBudget)InnerList[Index]; }
        }

        public class ParticipantActualExpensesBudget : ProgramBudget
        {
            public int ParticipantBudgetDTLID
            {
                get { return nParticipantBudgetDTLID; }
                set { nParticipantBudgetDTLID = value; }
            }

            public int ParticipantBudgetDTLExpenseID
            {
                get { return nParticipantBudgetDTLExpenseID; }
                set { nParticipantBudgetDTLExpenseID = value; }
            }

            public int FundingSource
            {
                get { return nActualExpenseSource; }
                set { nActualExpenseSource = value; }
            }

            public string ReferenceCode
            {
                get { return strActualExpenseSourceRefCode; }
                set { strActualExpenseSourceRefCode = value; }
            }

            public decimal Lodging
            {
                get { return decActualExpenseLodging; }
                set { decActualExpenseLodging = value; }
            }

            public decimal Catering
            {
                get { return decActualExpenseCatering; }
                set { decActualExpenseCatering = value; }
            }

            public decimal Miscellaneous
            {
                get { return decActualExpenseMisc; }
                set { decActualExpenseMisc = value; }
            }
        }

        class ParticipantActualExpenseBudgets : CollectionBase
        {
            public void Add(ParticipantActualExpensesBudget partActExpensesBudgetObject)
            { InnerList.Add(partActExpensesBudgetObject); }

            public void RemoveAt(int Index)
            { InnerList.RemoveAt(Index); }

            public ParticipantActualExpensesBudget Item(int Index)
            { return (ParticipantActualExpensesBudget)InnerList[Index]; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ron 6

ParticipantTypeBudget是...的成员ProgramBudget.ParticipantTypeBudget也继承ProgramBudget,这意味着它获得了所有ProgramBudget的非私人成员.

看到问题?

class Foo {
    class Bar : Foo {

    }
}

//perfectly legal:
Foo.Bar.Bar.Bar.Bar.Bar = new Foo.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar.Bar();
Run Code Online (Sandbox Code Playgroud)

要摆脱这种递归,移动ParticipantTypeBudget等等ProgramBudget.

编辑:另外,你问了自动属性.这些属性没有明确的支持字段.我使用两种模式:

对于读/写属性,执行以下操作:

public int MyProperty {
    get;
    set;
}
Run Code Online (Sandbox Code Playgroud)

请注意,get和set都不能包含正文.

如果您需要只读属性,即只能由对象本身设置的属性,请将set成员保护为:

public int MyProperty {
    get;
    protected set;
}
Run Code Online (Sandbox Code Playgroud)