PropertyInfoは、特定の列挙型である場合にはどのように伝えるには?
-
20-09-2019 - |
質問
私は、次のコードを持っています:
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
には、私は特別な何かをしたいです。データベースからの値がのは「M」と言ってみましょうとSetValue
の値が「ミスター」であるので、私は単純にEnum
することはできません。だから私は、別のメソッドを呼び出す必要があります。知っている!レガシーシステムですね。
それでは、どのように私はPropertyInfo
項目は、特定の列挙型である場合を決定しますか。
私が最初PropertyInfo
タイプはspecif列挙型であり、それがあるならば、私のメソッドを呼び出していない場合は、単純にSetValue
の実行を許可するかどうかをチェックしたいのですが、上記のコードでそう。
解決
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; }
}
他のヒント
ここで私は
の成功で使用するものですproperty.PropertyType.IsEnum
あなた上記のコードで、
bool isEnum = typeof(Enum).IsAssignableFrom(typeof(genericType));
列挙しないか(由来)、現在のタイプがあるかどうか、あなたを取得します。
これは、私は強く型付けされたリストに、データテーブルを変換するとき、私はどう処理するかです。
/// <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;
}
所属していません StackOverflow