我是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;
}
}
}
这就是我遇到的问题,如何将变量设置为枚举静态对象之一,以便从中获取属性?
答案 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。