使用枚举类

时间:2018-03-06 15:19:09

标签: c# class enumeration

我是C#的新手,我对抽象类和继承相对较新,而且我很难理解如何使用它们。我有这个抽象的枚举类:

public abstract class Enumeration : IComparable
{
    public uint Id { get; private set; }
    public string Name { get; private set; }
    public uint MaxTemperature { get; private set; }
    public double Density { get; private set; }

    protected Enumeration()
    {

    }

    protected Enumeration(uint id, string name, uint maxTemprature, double density)
    {
        Id = id;
        Name = name;
        MaxTemperature = maxTemprature;
        Density = density;
    }

    public static IEnumerable<T> GetAll<T>() where T : Enumeration, 
        new()
    {
        var type = typeof(T);
        var fields = type.GetTypeInfo().GetFields(BindingFlags.Public 
            | BindingFlags.Static | BindingFlags.DeclaredOnly);
        foreach (var info in fields)
        {
            var instance = new T();
            var locatedValue = info.GetValue(instance) as T;
            if (locatedValue != null)
            {
                yield return locatedValue;
            }
        }
    }

    public override bool Equals(object obj)
    {
        var otherValue = obj as Enumeration;
        if (otherValue == null)
        {
            return false;
        }
        var typeMatches = GetType().Equals(obj.GetType());
        var valueMatches = Id.Equals(otherValue.Id);
        return typeMatches && valueMatches;
    }

    public int CompareTo(object other)
    {
        return Id.CompareTo(((Enumeration)other).Id);
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

此类由我的材质类继承:

    class Material : Enumeration
{
    public static readonly Material FreeSpace =
        new Material(0, "Free Space", 0, 0);

    public static readonly Material CarbonSteel =
        new Material(1, "Carbon Steel", 2500, 0.284);

    private Material()
    {
    }

    private Material(uint id, string name, uint maxTemperature, 
        double density) : base(id, name, maxTemperature, density)
    {
    }

    private static IEnumerable<Material> List()
    {
        return new[] { FreeSpace, CarbonSteel };
    }
}

现在我想在我的零件类中使用这些材料:

    class Part
{
    private Material partMaterial;

    public Part() { }

    public Material PartMaterial
    {
        set
        {
            partMaterial = value;
        }
    }
}

这就是我遇到的问题,如何将变量设置为枚举静态对象之一,以便从中获取属性?

2 个答案:

答案 0 :(得分:1)

您可以使用SelectedItem代替SelectedIndex

part.PartMaterial = (Material) MaterialCombo.SelectedItem;

答案 1 :(得分:0)

所以,我希望我能按原样离开这个问题,因为最后这是提出问题的正确方法。但是在讽刺评论和评分下来后,我把它改成了我认为更好的东西。应该回答原始问题的方式是:

由于您要枚举材质类,因此需要一种方法来公开对象的枚举值。该 应该公开IEnumerable<Material> List()方法来实现这一目标。

然后,您可以使用MaterialCombo.DataSource = Material.List()使用材质对象填充组合框,并使用MaterialCombo.DisplayMember = "Name";在组合框中显示这些对象的名称。

最后,使用@ Oxald的答案将材料传递给您的零件类。

感谢@Mark Benningfield指出我要搜索的方向&#34;使用枚举来填充组合框&#34;这很有帮助。

和Oxald建议使用.SelectedItem而不是.SelectedIndex。