将PropertyInfo.PropertyType转换为枚举

时间:2015-02-13 15:11:20

标签: c# reflection enums

我有一个通用函数,可以使用反射从DataRow创建对象。我使用此功能从Access数据库导入表:

private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
{
    T item = new T();
    foreach (var prop in properties)
    {
        try
        {
            if (prop.PropertyType.IsEnum)
                prop.SetValue(item, row[prop.Name], null); // what to do??
            else
                prop.SetValue(item, row[prop.Name], null);
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Assert(false, string.Format("failed to assign {0} a value of {1}", prop.Name, row[prop.Name]));
        }
    }
    return item;
}

我遇到的问题是属性类型是enum时。我尝试过使用Enum.Parse,但这并没有成功(我无法编译)。

有没有办法使用我的函数将row[prop.Name]表示的对象转换为正确的enum?或者我是否需要编写特定于我定义的enum的特殊转换函数。

修改: 我正在

  

&#34;找不到类型或命名空间prop。你错过了装配指令或参考&#34;   编译以下错误:

var val = (prop.PropertyType)Enum.Parse(typeof(prop.PropertyType), row[prop.Name].ToString());

2 个答案:

答案 0 :(得分:4)

您获得type or namespace prop could not be found异常的原因是因为您无法以这种方式转换为类型(prop.PropertyType)Enum.Parse(typeof(prop.PropertyType) - 您只能在编译时知道类型的地方执行此操作 - {{1 }}

正确的方法是在设置属性值之前获取枚举值:

(SomeEnum)Enum.Parse(typeof(SomeEnum)

答案 1 :(得分:0)

我的班级就是这样

public enum Status
{
    Active,
    Deactive
}

public class Sample
{
    public long Id{ get; set; }
    public string Name{ get; set; }
    public Status UserStatus{ get; set; }
}

我在数据库中将Status =“ Active”存储为字符串。 我使用了您的解决方案,但出现以下错误

System.ArgumentException: 'The value passed in must be an enum base or an underlying type for an enum, such as an Int32. Parameter name: value'