我有以下代码:
public class DataReader<T> where T : class
{
public T getEntityFromReader(IDataReader reader, IDictionary<string, string> FieldMappings)
{
T entity = Activator.CreateInstance<T>();
Type entityType = entity.GetType();
PropertyInfo[] pi = entityType.GetProperties();
string FieldName;
while (reader.Read())
{
for (int t = 0; t < reader.FieldCount; t++)
{
foreach (PropertyInfo property in pi)
{
FieldMappings.TryGetValue(property.Name, out FieldName);
Type genericType = property.PropertyType;
if (!String.IsNullOrEmpty(FieldName))
property.SetValue(entity, reader[FieldName], null);
}
}
}
return entity;
}
}
当我到达Enum
类型的字段,或者在这种情况下NameSpace.MyEnum
时,我想做一些特别的事情。我不能简单地SetValue
,因为来自数据库的值是“m”,而Enum
中的值是“Mr”。所以我需要调用另一种方法。我知道!遗产系统对吗?
那么如何确定PropertyInfo
项目何时具有特定的枚举类型?
因此,在上面的代码中,我想首先检查PropertyInfo
类型是否具有特定的枚举,如果是,则调用我的方法,如果不是,则只需允许SetValue
运行。
答案 0 :(得分:26)
以下是我成功使用的内容
property.PropertyType.IsEnum
答案 1 :(得分:3)
在上面的代码中,
bool isEnum = typeof(Enum).IsAssignableFrom(typeof(genericType));
无论当前类型是否(来自)枚举,都会告诉您。
答案 2 :(得分:2)
static void DoWork()
{
var myclass = typeof(MyClass);
var pi = myclass.GetProperty("Enum");
var type = pi.PropertyType;
/* as itowlson points out you could just do ...
var isMyEnum = type == typeof(MyEnum)
... becasue Enums can not be inherited
*/
var isMyEnum = type.IsAssignableFrom(typeof(MyEnum)); // true
}
public enum MyEnum { A, B, C, D }
public class MyClass
{
public MyEnum Enum { get; set; }
}
答案 3 :(得分:0)
这是我将数据表转换为强类型列表时的处理方法
/// <summary>
/// Covert a data table to an entity wiht properties name same as the repective column name
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ConvertDataTable<T>(this DataTable dt)
{
List<T> models = new List<T>();
foreach (DataRow dr in dt.Rows)
{
T model = (T)Activator.CreateInstance(typeof(T));
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
foreach (PropertyDescriptor prop in properties)
{
//get the property information based on the type
System.Reflection.PropertyInfo propertyInfo = model.GetType().GetProperties().Last(p => p.Name == prop.Name);
var ca = propertyInfo.GetCustomAttribute<PropertyDbParameterAttribute>(inherit: false);
string PropertyName = string.Empty;
if (ca != null && !String.IsNullOrWhiteSpace(ca.name) && dt.Columns.Contains(ca.name)) //Here giving more priority to explicit value
PropertyName = ca.name;
else if (dt.Columns.Contains(prop.Name))
PropertyName = prop.Name;
if (!String.IsNullOrWhiteSpace(PropertyName))
{
//Convert.ChangeType does not handle conversion to nullable types
//if the property type is nullable, we need to get the underlying type of the property
var targetType = IsNullableType(propertyInfo.PropertyType) ? Nullable.GetUnderlyingType(propertyInfo.PropertyType) : propertyInfo.PropertyType;
// var propertyVal = Convert.ChangeType(dr[prop.Name], targetType);
//Set the value of the property
try
{
if (propertyInfo.PropertyType.IsEnum)
prop.SetValue(model, dr[PropertyName] is DBNull ? (object)null : Enum.Parse(targetType, Convert.ToString(dr[PropertyName])));
else
prop.SetValue(model, dr[PropertyName] is DBNull ? (object)null : Convert.ChangeType(dr[PropertyName], targetType));
}
catch (Exception ex)
{
//Logging.CustomLogging(loggingAreasType: LoggingAreasType.Class, loggingType: LoggingType.Error, className: CurrentClassName, methodName: MethodBase.GetCurrentMethod().Name, stackTrace: "There's some problem in converting model property name: " + PropertyName + ", model property type: " + targetType.ToString() + ", data row value: " + (dr[PropertyName] is DBNull ? string.Empty : Convert.ToString(dr[PropertyName])) + " | " + ex.StackTrace);
throw;
}
}
}
models.Add(model);
}
return models;
}