当我尝试设置子类的属性时,我收到此错误:
其他信息: Property set method not found.
有人可以对此有所了解吗? - 很明显他们有定位器,请参阅下面的img
类:
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);
答案 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
看起来重新发明轮子是不值得的。