C#递归反射:EF模型到视图模型(深层)>找不到属性集方法

时间:2016-02-16 07:00:48

标签: c# entity-framework recursion reflection viewmodel

当我尝试设置子类的属性时,我收到此错误:

其他信息: Property set method not found.

有人可以对此有所了解吗? - 很明显他们有定位器,请参阅下面的img

enter image description here

类:

public class Test
{
    public string Name {get;set}
    public LetterGrade Grade {get;set;}
}

pulic class LetterGrade
{
    public string Name {get;set;}
    public double GradePercentage {Get;set;}
}

使用:

var dbModel = context.Test.FirstOrDefault(w=>w.ID == ID)
this.Bind(dbModel);

以下是我一直在给孩子打电话的方式(很好),但宁愿只做一次电话(递归) 一些更复杂的对象会有孩子的孩子等等

this.LetterGrade.Bind(dbModel.LetterGrade); 

1 个答案:

答案 0 :(得分:2)

是的,从技术上讲,您的问题是您尝试将PropertyInfo类型的对象绑定到同一类型的另一个对象。

此外,您尝试在此处执行的操作还不是很清楚 - 如果source属性值为null,则您尝试将其值绑定到目标属性,这不应该发生。

代码可能应该重新安排并依赖于您专门尝试实现的行为:参考类型的深层副本,简单的参考副本,如何处理集合等等......

我修改了一些代码以显示这个想法:

public static void Bind(this object destination, object source)
        {
            if (source != null)
            {
                var destProperties = destination.GetType().GetProperties();
                foreach (var sourceProperty in source.GetType().GetProperties())
                {
                    var availableDestinationProperties = destProperties.Where(x=>x.Name == sourceProperty.Name && x.PropertyType.IsAssignableFrom(sourceProperty.PropertyType));

                    if (availableDestinationProperties.Count() == 0)
                    {
                        continue;
                    }

                    var destProperty = availableDestinationProperties.Single();

                    var sourcePropertyValue = sourceProperty.GetValue(source, null);
                    var destPropertyType = destProperty.PropertyType;    

                    if (sourcePropertyValue != null)
                    {   
                        if (IsCollection(destPropertyType))
                        {
                            //handle collections: either do collection item references copy, do deep copy of each element in collection, etc.. 
                        }

                        if (IsReferenceType(destPropertyType))
                        {
                            //do deep copy with recursion: create object OR do reference copy in case you need this
                        }

                        destProperty.SetValue(destination, sourcePropertyValue, new object[] { });
                    }
                }
            }
        }

随着时间的推移,这些条件的数量会增加,你必须进行大量的测试才能验证工作正常。

如果你编写一个中小型应用程序,你仍然可以使用AutoMapper,它并不那么慢。如果你不是特别喜欢它,还有其他第三方库可以做到 - 你可以看到像这样的问题,例如:Alternatives to AutoMapper

看起来重新发明轮子是不值得的。