Ard*_*oli 0 .net c# reflection
我有一个存储过程返回一个选择,如下所示:
select name , family , sex from person
Run Code Online (Sandbox Code Playgroud)
我有一个类将这样的人命名为:
public class person {
string name {get;set;}
string family {get;set;}
GenderEnum sex {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我有一个名为 GenderEnum 的枚举,如下所示:
Enum GenderEnum
{
Man = 1 ,
Woman = 2 ,
}
Run Code Online (Sandbox Code Playgroud)
我想将我的数据表转换为 Person 的 IList 。
我的问题是:当我想将性别列转换为性别字段时,我大多数将类型 int 转换为 GenderEnum。
不要忘记,我最有一种通用方法可以将所有 DataTable 转换为所有类,并且此方法最能识别每个属性都具有枚举类型。
此方法根据名称将所有列映射到所有属性
我写了这个方法,但这不适用于所有类型。
例如:如果我的列是 int 并且我的属性是 strinbe 并且具有相同的名称,则映射不起作用。
public List<T> ConvertTo<T>(DataTable datatable) where T : new()
{
var temp = new List<T>();
try
{
var columnsNames = (from DataColumn dataColumn in datatable.Columns select dataColumn.ColumnName).ToList();
temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => GetObject<T>(row, columnsNames));
return temp;
}
catch
{
return temp;
}
}
private T GetObject<T>(DataRow row, List<string> columnsName) where T : new()
{
T obj = new T();
try
{
string columnname = "";
PropertyInfo[] Properties = typeof(T).GetProperties();
foreach (PropertyInfo objProperty in Properties)
{
columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
if (!string.IsNullOrEmpty(columnname))
{
var value = row[columnname];
if (!string.IsNullOrEmpty(value.ToString()))
{
Type type;
type = Nullable.GetUnderlyingType(objProperty.PropertyType) ?? objProperty.PropertyType;
objProperty.SetValue(obj,
type == value.GetType()
? Convert.ChangeType(value, type)
: System.Enum.ToObject(type, value), null);
}
}
}
return obj;
}
catch (Exception exception)
{
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为您正在自找此GetObject方法的麻烦,并且您最好切换到 EF 或(实际上)任何其他 ORM,因为您所做的事情风险极大。考虑此代码的可维护性和可读性。不过,我知道您可能面临截止日期的压力,现阶段对此无能为力。
要快速解决您的问题,请考虑修改您的Person类,如下所示:
public class Person
{
public String Name { get; set; }
public String Family { get; set; }
public Int32 Sex { get; set; }
public GenderEnum EnumeratedSex
{
get
{
return Sex == 1 ? GenderEnum.Man : GenderEnum.Woman;
}
}
}
public enum GenderEnum
{
Man = 1,
Woman = 2
}
Run Code Online (Sandbox Code Playgroud)
我相信您的 Sex 字段只是数据库中的一个 int ,但如果不是,请相应地更改它。
请告诉我这是否有帮助。
| 归档时间: |
|
| 查看次数: |
2842 次 |
| 最近记录: |