如何使用反射映射集合属性

时间:2015-11-20 19:39:01

标签: c#

您好我有这些源和目标类,并且在映射ICollection SomeClasses {get; set}属性时遇到困难。我简化了它们,但实际的课程非常复杂。

public class Source
    {
        public string Name{get; set;}
        public ICollection<SomeClass> SomeClasses {get;set}
    }

    public class Result
    {
        public string Name{get; set;}
        public ICollection<SomeClass> SomeClasses {get;set}
    }

    public class SomeClass
    {
        public string Name {get; set;}
        public string SomeThing {get;set}
    }

这是我玩的代码,没有运气。

public object Map(object source, object result)
        {           
            foreach (PropertyInfo item in source.GetType().GetRuntimeProperties())
            {
                if (item.PropertyType.IsGenericType && item.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null)
                {
                    Type type = item.PropertyType.GetGenericArguments()[0];
                    var innerObj = FormatterServices.GetUninitializedObject(type);

                    var listType = typeof(List<>);
                    var constructedListType = listType.MakeGenericType(innerObj.GetType());

                    var newList = (IList)Activator.CreateInstance(constructedListType);

                    IEnumerable listValue = (IEnumerable)item.GetValue(source);

                    IEnumerable listValue = (IEnumerable)item.GetValue(source);

                    //newList.Add(innerObj);
                    //item.SetValue(source, newList);

                    foreach (var val in listValue)
                    {
                        newList.Add(val);
                    }

                    //list.Add(obj4);
                    //option a
                    //result.GetType().GetRuntimeProperty(item.Name).SetValue(result, newList);

    //option b
    result.GetType().GetRuntimeProperty(item.Name).SetValue(result, item.GetValue(source));

                }
            }
        }

1 个答案:

答案 0 :(得分:0)

选项a)在更改命名空间后为我工作,我在其中定义了类SomeClass。实际上SomeClass已经在不同的命名空间下定义了,我错了。