C# 关于反射的详细用法——把一个类转换成一个属性不同类型的结构体

无意之间看到的一个面试题

先看要转换的目标类

 /// <summary>
    /// 一个有很多属性的类
    /// </summary>
    /// 
    public class MObject
    {
        public int A1 { get; set; }

        public int A2 { get; set; }

        public int A3 { get; set; }

        public int A4 { get; set; }

        public int A5 { get; set; }

        public int A6 { get; set; }

        public int A7 { get; set; }

        public int A8 { get; set; }

        public int A9 { get; set; }

        public int A10 { get; set; }

        public double B1 { get; set; }

        public double B2 { get; set; }

        public double B3 { get; set; }

        public double B4 { get; set; }

        public double B5 { get; set; }

        public double B6 { get; set; }

        public double B7 { get; set; }

        public double B8 { get; set; }

        public double B9 { get; set; }

        public double B10 { get; set; }

        public double C1 { get; set; }

        public double C2 { get; set; }

        public double C3 { get; set; }

        public double C4 { get; set; }

        public double C5 { get; set; }
    }

再看想转换成的机构体

/// <summary>
    /// 一个有很多字段的结构体
    /// </summary>
    public struct MStruct
    {
        public int A1;
        public int A2;
        public int A3;
        public int A4;
        public int A5;
        public int A6;
        public int A7;
        public int A8;
        public int A9;
        public int A10;
        public double B1;
        public double B2;
        public double B3;
        public double B4;
        public double B5;
        public double B6;
        public double B7;
        public double B8;
        public double B9;
        public double B10;
        public string C1;
        public string C2;
        public string C3;
        public string C4;
        public string C5;
    }

可以看到在最后的C1~C5的数据类型是不同的。

话不多说:直接上代码

private void button4_Click(object sender, EventArgs e)
        {
            MObject _MObject = new MObject() {A1=1,A2=2,A3=4,C1=2.5,C2=3.5 };
            MStruct _MStruct=   new MStruct();
            //反射 
            #region
            Type type_MObject = _MObject.GetType();
            PropertyInfo[] propertyInfo_MObject = type_MObject.GetProperties();//获取到_MObject的所有属性
            foreach (var item in propertyInfo_MObject)//遍历MObject属性
            {
                //得到MObject中该属性的值,然后去MStruct中设置该属性的值
                object MObject_item_value = item.GetValue(_MObject, null);
                if (MObject_item_value != null)
                {
                    var Obj_MStruct = (object)_MStruct;
                    //得到结构体MStruct中该属性
                    var fieldsObjinfos = Obj_MStruct.GetType().GetField(item.Name);

                    //判断两个要赋值的属性类型是否相同
                    if (fieldsObjinfos.FieldType == item.PropertyType)
                    {
                        fieldsObjinfos.SetValue(Obj_MStruct, MObject_item_value);
                    }
                    else
                    {
                        //不同的话就做处理
                        fieldsObjinfos.SetValue(Obj_MStruct, (MObject_item_value).ToString());
                    }
                    //得到结果
                    _MStruct = (MStruct)Obj_MStruct;
                }
            }

            #endregion





        }
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangzm996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值