C# 如何更改c中属性的数据类型#
我正在尝试动态更改对象的数据类型, 这是我的设想 我在数据表中有数据,我需要将它映射到c中的对象# 以下是我遵循的步骤C# 如何更改c中属性的数据类型#,c#,reflection,type-inference,C#,Reflection,Type Inference,我正在尝试动态更改对象的数据类型, 这是我的设想 我在数据表中有数据,我需要将它映射到c中的对象# 以下是我遵循的步骤 循环遍历数据表并获取每个数据行 在循环中获取列 将列名、要为属性赋值的新对象、数据表单元格值传递给新方法 下面是示例代码 m1() { foreach (DataRow row in inputTable.Rows) { for
m1()
{
foreach (DataRow row in inputTable.Rows)
{
foreach (DataColumn col in inputTable.Columns)
{
m2(col.caption,row[col.caption].toString(),new product())
}
}
}
m1(string columnName,string cellValue,product mappingEntity){
foreach (var prop in entityToMap.GetType().GetProperties())
{
if (prop.Name.ToLower() == column.ToLower())
{
prop.SetValue(entityToMap, GetConverter(t)(cellValue));
break;
}
else if (prop.Name == "Site")
{
entityToMap.Site = MapSite(column, cellValue, new Domain.Entities.Site());
break;
}
else if (prop.Name == "Product_categories")
{
entityToMap.Product_categories.Add(MapProductToCategory(column, cellValue, new Domain.Entities.ProductToCategory()));
}
else if (prop.Name == "Category_searchgroups")
{
entityToMap.Category_searchgroups.Add(MapCategoryToSearchGroup(column, cellValue, new Domain.Entities.CategoryToSearchGroup()));
}
}
现在我需要动态更改赋值的数据类型
if (prop.Name.ToLower() == column.ToLower())
{
Type t = prop.PropertyType;
prop.SetValue(entityToMap, GetConverter(t)(cellValue));
break;
}
所以我在这里发现了类型推断问题
static Func GetConverter(T值)
{
返回(x)=>转换(x);
}
静态T转换(字符串值)
{
类型命运=类型(T);
//看看我们能不能投
尝试
{
返回(T)(对象)val;
}
捕获{}
//看看我们是否能解析
尝试
{
return(T)destiny.InvokeMember(“Parse”,System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,null,null,新对象[]{val});
}
捕获{}
//看看我们能不能转换
尝试
{
类型convertType=typeof(转换);
return(T)convertType.InvokeMember(“To”+destiny.Name,System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,null,null,new object[]{val});
}
捕获{}
//放弃
返回默认值(T);
}
问题是我有反射对象,我不能传递反射对象,因为它在该上下文中无效,
谁能帮我解决这个问题??
谢谢我不确定这是否是您需要的,但听起来像是
public static T RowToObjectClass<T>(DataRow r) where T : new()
{
T obj = new T();
foreach (PropertyInfo pi in typeof(T).GetProperties().Where(p => p.CanWrite))
{
pi.SetValue(obj, Convert.ChangeType(r[pi.Name], pi.PropertyType));
}
return obj;
}
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id", typeof(string)));
dt.Columns.Add(new DataColumn("date", typeof(string)));
dt.Rows.Add(new object[] { 1.ToString(), new DateTime(2018, 1, 1).ToString() });
dt.Rows.Add(new object[] { 2.ToString(), new DateTime(2018, 2, 2).ToString() });
foreach (DataRow r in dt.Rows)
{
Console.WriteLine("Row: " + r[0].ToString() + " (" + r[0].GetType() + ")" + ", " + r[1].ToString() + " (" + r[1].GetType() + ")");
MyClass c = RowToObjectClass<MyClass>(r);
Console.WriteLine("Class: " + c.Id.ToString() + " (" + c.Id.GetType() + ")" + ", " + c.Date.ToString() + " (" + c.Date.GetType() + ")");
}
}
public class MyClass
{
public int Id { get; set; }
public DateTime Date { get; set; }
}
公共静态T RowToObjectClass(DataRow r),其中T:new()
{
T obj=新的T();
foreach(typeof(T).GetProperties()中的PropertyInfo pi,其中(p=>p.CanWrite))
{
SetValue(obj,Convert.ChangeType(r[pi.Name],pi.PropertyType));
}
返回obj;
}
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
Add(新数据列(“id”,typeof(string));
添加(新的数据列(“日期”,typeof(字符串));
Add(新对象[]{1.ToString(),新日期时间(2018,1,1).ToString()});
Add(新对象[]{2.ToString(),新日期时间(2018,2,2.ToString()});
foreach(数据行r在dt.行中)
{
Console.WriteLine(“行:+r[0].ToString()+”(“+r[0].GetType()+”)“+”,“+r[1].ToString()+”(“+r[1].GetType()+”));
MyClass c=行对象类(r);
Console.WriteLine(“类:“+c.Id.ToString()+”(“+c.Id.GetType()+”)”+”,“+c.Date.ToString()+”(“+c.Date.GetType()+”));
}
}
公共类MyClass
{
公共int Id{get;set;}
公共日期时间日期{get;set;}
}
<代码>什么类型的代码> EnTyToMAP?为什么不使用<代码>转换?转换(?)/代码>?也许这可以帮助:我会考虑使用一些类似的方法来处理这个问题。它可以为您提供一种很好的结构化方法来控制字段映射。另外,你不必直接处理反射。谢谢卡拉,你的回答引导我纠正了一个。再次感谢。
public static T RowToObjectClass<T>(DataRow r) where T : new()
{
T obj = new T();
foreach (PropertyInfo pi in typeof(T).GetProperties().Where(p => p.CanWrite))
{
pi.SetValue(obj, Convert.ChangeType(r[pi.Name], pi.PropertyType));
}
return obj;
}
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id", typeof(string)));
dt.Columns.Add(new DataColumn("date", typeof(string)));
dt.Rows.Add(new object[] { 1.ToString(), new DateTime(2018, 1, 1).ToString() });
dt.Rows.Add(new object[] { 2.ToString(), new DateTime(2018, 2, 2).ToString() });
foreach (DataRow r in dt.Rows)
{
Console.WriteLine("Row: " + r[0].ToString() + " (" + r[0].GetType() + ")" + ", " + r[1].ToString() + " (" + r[1].GetType() + ")");
MyClass c = RowToObjectClass<MyClass>(r);
Console.WriteLine("Class: " + c.Id.ToString() + " (" + c.Id.GetType() + ")" + ", " + c.Date.ToString() + " (" + c.Date.GetType() + ")");
}
}
public class MyClass
{
public int Id { get; set; }
public DateTime Date { get; set; }
}