我有一个模型......实际上有几个,但为了这个问题我们只需要一个......
public class DeliverableType : BModelBase, ISingleID
{
public Int64 ID { get; set; }
public String Label { get; set; }
public String Description { get; set; }
public Int64 TestID { get; set; }
}
因此,鉴于此模型,我希望能够运行一个方法,如...
DeliverableType objA = new DeliverableType();
DeliverableType objB = Repository.GetDeliverableType(objA.ID);
objA.Merge(objB);
这会将objA的属性值与objB的相应属性进行比较。 objA上分配了默认值(基于其类型)的任何属性值都应替换为分配给objB上相应属性的值。
所以如果objA值设置为......
objA.ID = 100;
objA.Label = null; // equals default(String)
objA.Description = "Some clever description here";
objA.TestID = 0; // equals default(Int64)
并且objB值设置为......
objA.ID = 100;
objA.Label = "Clever TITLE";
objA.Description = "Some not-so clever description here";
objA.TestID = 50;
我想跑...
objA.Merge(objB);
结果的objA属性值看起来像......
objA.ID = 100;
objA.Label = "Clever TITLE";
objA.Description = "Some clever description here";
objA.TestID = 50;
objA上已分配默认值的所有字段都将替换为objB中的值。
我环顾四周,发现了有关迭代属性或找到属性类型的一些建议,但是当把这些碎片放在一起时,它无法正常工作。
我正在创建一个扩展类,以便在适当的模型上添加它。我根据它们都将从中得到的基类来确定哪些模型可以解决扩展问题。
public static void Merge(this BModelBase model, BModelBase entity)
{
IList diffProperties = new ArrayList();
foreach (var modelProp in model.GetType().GetProperties())
{
var propType = modelProp.PropertyType;
var entityPropVal = entity.GetType().GetProperty(modelProp.Name).GetValue(entity);
var modelPropVal = modelProp.GetValue(model);
if (!Object.Equals(modelPropVal, entityPropVal) )
{
if (propType.IsValueType && modelPropVal == default(propType)) // compiler chokes on this line
{
modelProp.SetValue(model, entityPropVal);
}
}
}
}
公平地说,我并没有真正期望这个确切的代码可以工作,但是我希望它会引导我朝着正确的方向发展。但是,我得到一个奇怪的错误。在线...
if (propType.IsValueType && modelPropVal == default(propType))
default()调用中第二次出现变量“propType”正在返回编译错误...
The type or namespace name 'propType' could not be found (are you missing a using directive or an assembly reference?)
这没有任何意义,因为它显然已被定义,并且实际上在代码的其他地方被识别,即使在相同的表达式中也是如此。
寻找有关编译器为什么在这条线上进行抨击的任何想法,以及有关如何更好地实现此功能的任何想法。如果新方向绕过我的编译器问题......我也很擅长。
感谢