设置由字符串给出的枚举类型的属性

本文关键字:枚举 属性 类型 字符串 设置 | 更新日期: 2023-09-27 18:01:24

在我的类中有一些enum,就像这样:

public enum A { A1, A2 }
public enum B { B1, B2 }

问题是当我试图从XML文件中读取项目(每个字段由属性名称和属性值给出-两个字符串)。

现在我得到了我的方法,这是设置单个属性的值(只有部分与isEnum检查)。

public A classfield
{
  get;
  set;
}
public bool DynamicallySetItemProperty(string name, string value)
{
  // value = "A1" or "A2"; - value given in string.
  // name = "classfield"; - name of property.
  PropertyInfo p = this.GetType().GetProperty(name);
  if (p.PropertyType.IsEnum)
  {
    var a = (A) Enum.Parse(typeof(A), value);
    p.SetValue(this, a);
  }
  return true;
}

但在这个我不检查字段是A或B-enum。

有没有办法让我的方法检查enum类型,然后解析我的字符串到这个enum,像这样:

public bool DynamicallySetItemProperty(string name,string value)
{
  PropertyInfo p = this.GetType().GetProperty(name);
  if (p.PropertyType.IsEnum)
  {    
    var a = (p.GetType()) Enum.Parse(typeof(p.GetType()), value); // <- it doesn't work
    p.SetValue(this, a);
  }
  return true;
}

所以我需要检查属性的枚举类型,然后解析我的字符串值到这个枚举类型,而不使用if/else或开关语句(这是有问题的,当我得到了很多枚举类型)。有什么简单的方法吗?

设置由字符串给出的枚举类型的属性

不需要进一步检查类型。Enum.Parse()将类型作为第一个参数,您需要的类型是p.PropertyType(因为这是属性的类型)。SetValue()object作为值的参数,因此不需要强制转换Enum.Parse()的返回值:

PropertyInfo p = this.GetType().GetProperty(name);
if (p.PropertyType.IsEnum)
   p.SetValue(this, Enum.Parse(p.PropertyType, value));

注意 p.GetType()返回PropertyInfoType实例,而不是enum类型!

您不需要这个,因为PropertyInfo.SetValue需要object的实例作为第二个参数。因此,您不需要注意具体的类型,只需使用以下命令即可:

var parsedValue = Enum.Parse(p.PropertyType, value);
p.SetValue(this, parsedValue, null);