Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#设计一个支持枚举的类_C#_.net - Fatal编程技术网

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”