我的课上有一些枚举,看起来像这样:
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语句的情况下将我的字符串值解析为此枚举类型(当我有很多枚举类型时,它会出现问题)。有没有简单的方法呢?
答案 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);