Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改c中属性的数据类型#_C#_Reflection_Type Inference - Fatal编程技术网

C# 如何更改c中属性的数据类型#

C# 如何更改c中属性的数据类型#,c#,reflection,type-inference,C#,Reflection,Type Inference,我正在尝试动态更改对象的数据类型, 这是我的设想 我在数据表中有数据,我需要将它映射到c中的对象# 以下是我遵循的步骤 循环遍历数据表并获取每个数据行 在循环中获取列 将列名、要为属性赋值的新对象、数据表单元格值传递给新方法 下面是示例代码 m1() { foreach (DataRow row in inputTable.Rows) { for

我正在尝试动态更改对象的数据类型, 这是我的设想 我在数据表中有数据,我需要将它映射到c中的对象#

以下是我遵循的步骤

  • 循环遍历数据表并获取每个数据行
  • 在循环中获取列
  • 将列名、要为属性赋值的新对象、数据表单元格值传递给新方法
  • 下面是示例代码

                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; }
    }