Tôi có đoạn mã sau:Làm cách nào để biết một PropertyInfo có thuộc loại enum cụ thể không?
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;
}
}
Khi tôi nhận được vào một lĩnh vực loại Enum
, hoặc trong trường hợp này NameSpace.MyEnum
, tôi muốn làm một cái gì đó đặc biệt. Tôi không thể chỉ đơn giản là SetValue
vì giá trị đến từ cơ sở dữ liệu là giả sử "m" và giá trị trong số Enum
là "Mr". Vì vậy, tôi cần phải gọi một phương pháp khác. Tôi biết! Hệ thống cũ phải không?
Vậy làm cách nào để xác định thời điểm một mục PropertyInfo
thuộc loại liệt kê cụ thể? Vì vậy, trong đoạn mã trên, tôi muốn kiểm tra xem loại PropertyInfo
có thuộc loại specif hay không và nếu nó sau đó gọi phương thức của tôi và nếu không thì chỉ cần cho phép SetValue
chạy.
Thay vì sử dụng Activator.CreateInstance(), chỉ cần thêm ràng buộc "mới" vào generic của bạn: "trong đó T: class, new()". Sau đó, chỉ cần sử dụng "T entity = new T()". Bằng cách đó, bạn có thể thực thi sự cần thiết của một hàm tạo parameterless tại thời gian biên dịch. –
Brannon
@Brannon, cảm ơn đó là một mẹo tuyệt vời. sẽ làm gì khi tôi đi làm. cảm ơn. – griegs