设置由字符串

时间:2016-08-09 13:10:38

标签: c# properties enums

我的课上有一些枚举,看起来像这样:

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。

有没有办法让我的方法检查枚举类型,然后将我的字符串解析为这个枚举,类似这样:

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或switch语句的情况下将我的字符串值解析为此枚举类型(当我有很多枚举类型时,它会出现问题)。有没有简单的方法呢?

2 个答案:

答案 0 :(得分:3)

无需进一步检查类型。 Enum.Parse()将类型作为第一个参数,您需要的类型为p.PropertyType(因为这是属性的类型SetValue()需要{{1}无论如何,作为值的参数,所以不需要转换object的返回值:

Enum.Parse()

注意 PropertyInfo p = this.GetType().GetProperty(name); if (p.PropertyType.IsEnum) p.SetValue(this, Enum.Parse(p.PropertyType, value)); 返回p.GetType()的{​​{1}}个实例,而不是枚举类型!

答案 1 :(得分:0)

您不需要这样,因为PropertyInfo.SetValue期望object的实例作为第二个参数。因此,您不需要关注特定类型,只需使用它:

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