我有一个通用函数,可以使用反射从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());
答案 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'