C#设计一个支持枚举的类
我在尝试解决这个问题时遇到了一些困难,当然也有可能是我没有找到正确的位置,但是我在设计一个包含单个属性集合的类时遇到了困难,并且该类还支持轻松枚举该类中的所有属性。 例如:C#设计一个支持枚举的类,c#,.net,C#,.net,我在尝试解决这个问题时遇到了一些困难,当然也有可能是我没有找到正确的位置,但是我在设计一个包含单个属性集合的类时遇到了困难,并且该类还支持轻松枚举该类中的所有属性。 例如: public class CharacterStats { public List<BaseStat> StatList { get; set; } private BaseStat Level { get; set; } private BaseStat Health { get; s
public class CharacterStats
{
public List<BaseStat> StatList { get; set; }
private BaseStat Level { get; set; }
private BaseStat Health { get; set; }
private BaseStat Damage { get; set; }
private BaseStat Defense { get; set; }
}
private void InitializeList()
{
StatList = new List<BaseStat>
{
Level,
Health,
Damage,
Defense,
};
}
公共类CharacterStats
{
公共列表StatList{get;set;}
专用BaseStat级别{get;set;}
私有BaseStat运行状况{get;set;}
私有BaseStat损坏{get;set;}
专用BaseStat防御{get;set;}
}
私有无效初始值列表()
{
StatList=新列表
{
水平,
卫生,,
损害,
防守
};
}
归根结底,每个属性本身都很重要,但在某些情况下,我希望遍历所有这些属性并对每个属性执行检查
我(有点)熟悉反射
,但这样迭代属性感觉很笨拙,没有必要。我目前已经设置好将属性滚动到列表中并以这种方式进行迭代,但我仍然不确定这是“正确”的实现
需要注意的一些事项:
- 根据使用情况,我可能希望更新对单个属性的引用(按名称),或者更新整个集合(可能通过枚举)
- 更新整个集合时,它将(很可能)与另一个类型为
CharacterStats
(或类似)的对象一起更新,该对象包含这些属性的部分或全部的修饰符
理想情况下,我正在寻找一种解决方案,将这个类表示为一个集合,我可以根据需要轻松地更新单个值或多个值
使用列表
或反射
是正确的做法,还是有更好的方法我没有考虑过?在过去的几天里,我在互联网上做了大量的挖掘工作,试图找到一个解决方案,但我要么找到了(我认为)不相关的信息,要么只是让自己更加困惑
客观地说,考虑到潜在的性能问题(我听过关于反射的争论),特别是易用性和可读性,我应该如何设计这个类,以便我可以像我所描述的那样使用它
如果需要任何进一步的信息进行澄清,请发表评论。使用字典
您可以迭代dic.键
或访问dic[“级别”]
如果您实际使用枚举
作为键类型,可获得额外积分,以防止键入错误。使用字典
您可以迭代dic.键
或访问dic[“级别”]
如果您实际使用enum
作为键类型,以防止键入错误,那么您可以获得额外的积分。您还可以查看使用动态属性创建的类,并允许枚举这些属性(通过实现IDictionary
接口)
请注意,您的示例代码有一个大问题:它将属性提前添加到列表中(如果您要使用字典),但这些属性与对真实对象属性的更改不同步。如果您希望保留与您所做的解决方案一样通用的手制解决方案,我宁愿这样做:
public class CharacterStats
{
public IEnumerable<BaseStat> GetStats() {
yield return Level;
yield return Health;
yield return Damage;
yield return Defense;
}
public BaseStat Level { get; set; }
public BaseStat Health { get; set; }
public BaseStat Damage { get; set; }
public BaseStat Defense { get; set; }
}
公共类CharacterStats
{
公共IEnumerable GetStats(){
收益率水平;
收益回报健康;
屈服返回损伤;
屈服回击防御;
}
公共BaseStat级别{get;set;}
公共BaseStat运行状况{get;set;}
公共BaseStat损坏{get;set;}
公共BaseStat防御{get;set;}
}
这里的枚举不“传递”属性类型,因此应该由具体类型覆盖(例如,通过使用LevelStat、HealthStat等类)或者通过返回一个以名称或枚举作为键的KeyValuePair枚举。您还可以查看考虑了动态属性的类,并允许枚举这些属性(通过实现IDictionary
接口)
请注意,您的示例代码有一个大问题:它将属性提前添加到列表中(如果您要使用字典),但这些属性与对真实对象属性的更改不同步。如果您希望保留与您所做的解决方案一样通用的手制解决方案,我宁愿这样做:
public class CharacterStats
{
public IEnumerable<BaseStat> GetStats() {
yield return Level;
yield return Health;
yield return Damage;
yield return Defense;
}
public BaseStat Level { get; set; }
public BaseStat Health { get; set; }
public BaseStat Damage { get; set; }
public BaseStat Defense { get; set; }
}
公共类CharacterStats
{
公共IEnumerable GetStats(){
收益率水平;
收益回报健康;
屈服返回损伤;
屈服回击防御;
}
公共BaseStat级别{get;set;}
公共BaseStat运行状况{get;set;}
公共BaseStat损坏{get;set;}
公共BaseStat防御{get;set;}
}
这里的枚举不“传递”属性类型,因此应该由具体类型覆盖(例如,通过使用LevelStat、HealthStat等类)或者使用名称或枚举作为键返回KeyValuePair枚举。以您的代码为例,为什么不创建一个列表
?尽管我认为这不是一个很好的解决方案。您可以在您的类上创建一个IEnumerable类型的属性,然后返回所有属性?@DarrenYoung为省略该代码表示歉意,但没有这就是我目前正在做的。这是可行的,但我正在尝试找出是否有更好的方法来表示此数据。我已将列表代码添加到示例中。使用字典或字典,其中StatID
是枚举类型。然后可以枚举字典条目或访问单个属性通常通过它们的名称(字符串或枚举值)@Tom:“建议的字典效率低得离谱”——我很难看出它是如何“低效率”的,更不用说“ri”