无意之间看到的一个面试题
先看要转换的目标类
/// <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
}