如何确定属性值是否已在C#中设置为其类型的默认值

时间:2015-09-17 17:14:36

标签: c# reflection system.reflection

我有一个模型......实际上有几个,但为了这个问题我们只需要一个......

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?)

这没有任何意义,因为它显然已被定义,并且实际上在代码的其他地方被识别,即使在相同的表达式中也是如此。

寻找有关编译器为什么在这条线上进行抨击的任何想法,以及有关如何更好地实现此功能的任何想法。如果新方向绕过我的编译器问题......我也很擅长。

感谢

0 个答案:

没有答案