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


    }