.net Net中的映射
我使用的应用程序需要将转换器数据类型写入另一个。例如:.net Net中的映射,.net,mapping,automapper,.net,Mapping,Automapper,我使用的应用程序需要将转换器数据类型写入另一个。例如: public class WcfContactName { public string FirstName {get; set;} public string LastName {get; set;} } public class IosContactName { public string FirstName {get; set;} public string LastName {get; set;} } 我必须编写一个实用类Auto
public class WcfContactName
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
public class IosContactName
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
我必须编写一个实用类AutoMapper,它自动执行映射属性类,前提是:
-具有相同的名称忽略小写/大写
-具有相同的数据类型
我必须为无限嵌套级别创建映射属性。您还需要允许在转换过程中忽略某些属性。编写代码时,请遵循测试驱动的开发过程。谁能帮我?谢谢您需要使用反射系统。反射命名空间机制。对于这两个映射类型,您需要获取有关TypesTypeInfo类及其属性PropertyInfo类的信息,然后为映射构建逻辑。使用PropertyInfo类可以获得属性的名称和类型。反射允许您获取和设置对象属性的值,以便能够构建映射器。它还允许您调用方法、构造函数和执行其他操作 您可以使用我的AutoMapper项目,而不必费心编写自己的项目
你有什么特别的问题吗?这太宽了。你实际上是在要求其他人编写你的映射器。你标记了你的帖子自动映射器。这是一个开源项目,已经完成了您概述的工作。
public class AutoMap
{
public List<string> BlackList = new List<string>();
//public void Map(object o1, object o2)
public void Map<K, T>(K o1, T o2)
{
for (int i = 0; i < BlackList.Count; i++)
{
BlackList[i] = BlackList[i].ToUpper();
}
//BlackList.ForEach(delegate(string s) { s = s.ToUpper(); });
//if (o1 == null || o2 == null)
// return;
//Type t1 = o1.GetType();
Type t1 = typeof(K);
IList<PropertyInfo> props1 = new List<PropertyInfo>(t1.GetProperties());
//Type t2 = o2.GetType();
Type t2 = typeof(T);
IList<PropertyInfo> props2 = new List<PropertyInfo>(t2.GetProperties());
for (int i = 0; i < props1.Count; i++)
{
object propValue1 = (o1 != null ? props1[i].GetValue(o1, null) : null);
string Name = props1[i].Name;
Type tt1 = props1[i].PropertyType;
for (int j = 0; j < props2.Count; j++)
{
if (!BlackList.Contains(props2[j].Name.ToUpper())
&& props2[j].Name.ToUpper() == Name.ToUpper())
{
object propValue2 = (o2 != null ? props2[j].GetValue(o2, null) : null);
Type tt2 = props2[j].PropertyType;
if (tt1.Equals(tt2))
{
if (o2!= null)
props2[j].SetValue(o2, propValue1, null);
}
else
{
if (tt1.IsClass && tt2.IsClass)
{
MethodInfo mi = this.GetType().GetMethod("Map").MakeGenericMethod(new Type[] { tt1, tt2 });
mi.Invoke(this, new object[] { propValue1, propValue2 });
props2[j].SetValue(o2, propValue2, null);
}
}
break;
}
}
}
}
}