C#在运行时修改自定义数据类型的返回
我一直在自学C#,我只是在学习如何使用自定义数据类型。我正在编写的程序生成一组坐标对。我认为创建一个包含每个集合(x1、x2、y1、y2)以及与该集合相关的一些其他变量的数据类型是个好主意。然而,该程序将生成多个坐标集数组(不同类别),因此跟踪情况仍然很困难。然后,我将其进一步细分为多个类别,并将每个类别放在第三种类型下,作为第三个级别,然后将其放入列表中 项目的每个“层”都有一些特定于该层的属性,但在此之前,我不需要在层次结构之间交换数据。当我意识到需要使用偏移修改坐标对集时,问题就出现了,每个偏移都是特定于父数据类型的。我可以修改get{}代码以返回数据加上偏移量(我称之为“skew”),但如果偏移量来自数据类型的类本身之外,则不能。我尝试在父数据类型(甚至是公共静态数据类型)中设置一个值,但由于某种原因,子数据类型无法读取该值 我知道的唯一方法是在每个坐标集中设置属性,但可能有数千个。该值对于父级来说是唯一的,但是所有子级都需要使用它,因此这似乎是浪费,因为还有很多其他的计算在进行。我的另一个想法是维护偏移量数组,并将其添加到检索值的位置。但是,这并不像在数据类型本身中包含它那样干净,因此它会增加混乱。有没有其他方法可以做到这一点 下面是一些代码的外观:C#在运行时修改自定义数据类型的返回,c#,custom-data-type,C#,Custom Data Type,我一直在自学C#,我只是在学习如何使用自定义数据类型。我正在编写的程序生成一组坐标对。我认为创建一个包含每个集合(x1、x2、y1、y2)以及与该集合相关的一些其他变量的数据类型是个好主意。然而,该程序将生成多个坐标集数组(不同类别),因此跟踪情况仍然很困难。然后,我将其进一步细分为多个类别,并将每个类别放在第三种类型下,作为第三个级别,然后将其放入列表中 项目的每个“层”都有一些特定于该层的属性,但在此之前,我不需要在层次结构之间交换数据。当我意识到需要使用偏移修改坐标对集时,问题就出现了,每
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)
{
斯洛特罗