C#在运行时修改自定义数据类型的返回

C#在运行时修改自定义数据类型的返回,c#,custom-data-type,C#,Custom Data Type,我一直在自学C#,我只是在学习如何使用自定义数据类型。我正在编写的程序生成一组坐标对。我认为创建一个包含每个集合(x1、x2、y1、y2)以及与该集合相关的一些其他变量的数据类型是个好主意。然而,该程序将生成多个坐标集数组(不同类别),因此跟踪情况仍然很困难。然后,我将其进一步细分为多个类别,并将每个类别放在第三种类型下,作为第三个级别,然后将其放入列表中 项目的每个“层”都有一些特定于该层的属性,但在此之前,我不需要在层次结构之间交换数据。当我意识到需要使用偏移修改坐标对集时,问题就出现了,每

我一直在自学C#,我只是在学习如何使用自定义数据类型。我正在编写的程序生成一组坐标对。我认为创建一个包含每个集合(x1、x2、y1、y2)以及与该集合相关的一些其他变量的数据类型是个好主意。然而,该程序将生成多个坐标集数组(不同类别),因此跟踪情况仍然很困难。然后,我将其进一步细分为多个类别,并将每个类别放在第三种类型下,作为第三个级别,然后将其放入列表中

项目的每个“层”都有一些特定于该层的属性,但在此之前,我不需要在层次结构之间交换数据。当我意识到需要使用偏移修改坐标对集时,问题就出现了,每个偏移都是特定于父数据类型的。我可以修改get{}代码以返回数据加上偏移量(我称之为“skew”),但如果偏移量来自数据类型的类本身之外,则不能。我尝试在父数据类型(甚至是公共静态数据类型)中设置一个值,但由于某种原因,子数据类型无法读取该值

我知道的唯一方法是在每个坐标集中设置属性,但可能有数千个。该值对于父级来说是唯一的,但是所有子级都需要使用它,因此这似乎是浪费,因为还有很多其他的计算在进行。我的另一个想法是维护偏移量数组,并将其添加到检索值的位置。但是,这并不像在数据类型本身中包含它那样干净,因此它会增加混乱。有没有其他方法可以做到这一点

下面是一些代码的外观:

public class SlotData
    {
        private double _x1, _x2, _y1, _y2;

        public double X1
        {
            get { return _x1; }
            set { _x1 = value; }
        }
        public double X2
        {
            get { return _x2; }
            set { _x2 = value; }
        }
        public double Y1
        {
            get { return _y1; }
            set { _y1 = value; }
        }
        public double Y2
        {
            get { return _y2; }
            set { _y2 = value; }
        }
    }
public class ClientInfo
    {
        public static double _skewX, _skewY;

        public SlotGroup1 Group1
        {
            get;
            set;
        }
        public SlotGroup2 Group2
        {
            get;
            set;
        }
        public SlotGroup3 Group3
        {
            get;
            set;
        }
    }

public class SlotGroup1
    {
        public SlotData Slot1
        {
            get;
            set;
        }
        public SlotData Slot2
        {
            get;
            set;
        }
    }
在代码中,既没有父数据类型,也没有子数据类型。因此,某些类型的成员不能以任何方式被其他类型访问,除非您将引用某个类型的对象实例。

但是面向对象编程可以帮助你。如果
SlotGroupN
类型中的每个类型都必须引用
ClientInfo
,则有必要使用基类
SlotGroupBase
,其中将包含对
ClientInfo
的引用。此外,您还应该向
SlotData
添加对
SlotGroupBase
的类型引用。在这种情况下,您将访问您的倾斜,如

return _group.ClientInfo._skewX + X1;
另一个好主意是限制您自己和其他开发人员创建
SlotGroupN
类实例而不引用
ClientInfo
SlotData
类项而不引用
SlotGroupN
。要实现这一点,您应该将默认构造函数设为私有,并使用参数
ClientInfo

public SlotGroupBase(ClientInfo ci) 
在代码中,既没有父数据类型,也没有子数据类型。因此,某些类型的成员不能以任何方式被其他类型访问,除非您将引用某个类型的对象实例。

但是面向对象编程可以帮助你。如果
SlotGroupN
类型中的每个类型都必须引用
ClientInfo
,则有必要使用基类
SlotGroupBase
,其中将包含对
ClientInfo
的引用。此外,您还应该向
SlotData
添加对
SlotGroupBase
的类型引用。在这种情况下,您将访问您的倾斜,如

return _group.ClientInfo._skewX + X1;
另一个好主意是限制您自己和其他开发人员创建
SlotGroupN
类实例而不引用
ClientInfo
SlotData
类项而不引用
SlotGroupN
。要实现这一点,您应该将默认构造函数设为私有,并使用参数
ClientInfo

public SlotGroupBase(ClientInfo ci) 

扩展您的设计

using System.Drawing;

public class SlotData
{
    private PointF _one;
    private PointF _two;

    internal SizeF Skew {get; set;}

    public PointF One 
    {
        get
        {
            return PointF.Add(_one, Skew);
        }
        set {_one = value; }
    }

    public PointF Two 
    {
        get
        {
            return PointF.Add(_two, Skew);
        }
        set {_two = value; }
    }
}

public class SlotGroup : List<SlotData>
{
    internal SizeF Skew
    {
        set
        {
            foreach(var slotData in this)
            {
                slotData.Skew = value;
            }
        }
    }
}

public class ClientData : List<SlotGroup>
{
    private SizeF _skew;

    public SizeF Skew
    {
        get { return _skew; }

        set
        {
            _skew = value;
            foreach (var slotGroup in this)
            {
                slotGroup.Skew = value;
            }
        }
    }
}
使用系统图;
公共类SlotData
{
私有点f_一;
私有点f_二;
内部SizeF Skew{get;set;}
公共点一
{
得到
{
返回点f.Add(_one,Skew);
}
设置{u one=value;}
}
公共点F 2
{
得到
{
返回点f.Add(_-two,Skew);
}
设置{u two=value;}
}
}
公共类SlotGroup:列表
{
内部尺寸偏差
{
设置
{
foreach(本文件中的var slotData)
{
slotData.Skew=值;
}
}
}
}
公共类ClientData:列表
{
私人SizeF_歪斜;
公共尺寸偏差
{
获取{return\u skew;}
设置
{
_歪斜=值;
foreach(此字段中的var slotGroup)
{
slotGroup.Skew=值;
}
}
}
}

我想不出还有比这更优雅的了。封装说明所包含的类无法访问其容器的数据,而覆盖容器类上的子访问的代码将更加繁琐。

扩展您的设计

using System.Drawing;

public class SlotData
{
    private PointF _one;
    private PointF _two;

    internal SizeF Skew {get; set;}

    public PointF One 
    {
        get
        {
            return PointF.Add(_one, Skew);
        }
        set {_one = value; }
    }

    public PointF Two 
    {
        get
        {
            return PointF.Add(_two, Skew);
        }
        set {_two = value; }
    }
}

public class SlotGroup : List<SlotData>
{
    internal SizeF Skew
    {
        set
        {
            foreach(var slotData in this)
            {
                slotData.Skew = value;
            }
        }
    }
}

public class ClientData : List<SlotGroup>
{
    private SizeF _skew;

    public SizeF Skew
    {
        get { return _skew; }

        set
        {
            _skew = value;
            foreach (var slotGroup in this)
            {
                slotGroup.Skew = value;
            }
        }
    }
}
使用系统图;
公共类SlotData
{
私有点f_一;
私有点f_二;
内部SizeF Skew{get;set;}
公共点一
{
得到
{
返回点f.Add(_one,Skew);
}
设置{u one=value;}
}
公共点F 2
{
得到
{
返回点f.Add(_-two,Skew);
}
设置{u two=value;}
}
}
公共类SlotGroup:列表
{
内部尺寸偏差
{
设置
{
foreach(本文件中的var slotData)
{
slotData.Skew=值;
}
}
}
}
公共类ClientData:列表
{
私人SizeF_歪斜;
公共尺寸偏差
{
获取{return\u skew;}
设置
{
_歪斜=值;
foreach(此字段中的var slotGroup)
{
斯洛特罗