c#无法检查属性是否未设置

时间:2015-02-13 17:51:07

标签: c# .net wcf variables properties

背景:

  1. WCF service proxy not setting "FieldSpecified" property
  2. MSDN Forums: parameter-names-ending-with-specified-added-to-web-service-method-call?forum=wcf
  3. 我厌倦了在我的网络服务客户端中手动设置了几十个“_Specified”字段(适用于{strong>长和日期时间Struct数据类型),所以我想我会尝试遍历我的Soap Body中的所有属性,如果它是一个名为Specified AND的布尔值,如果已经设置了属性(例如Birthdate),那么我可以将该属性默认为true。 / p>

    所以我编写了这个代码来循环,并检查属性是否为null然后如果没有,将相应的 Specified 属性设置为true:

        Type type = wsSoapBody.GetType();
    
        PropertyInfo[] properties = type.GetProperties();
    
        foreach (PropertyInfo property in properties)
        {
            foreach (var pi in wsSoapBody.GetType().GetProperties().Where(o => o.Name == property.Name + "Specified"))
            {
                if (property != null)
                {
                    pi.SetValue(wsSoapBody, true, BindingFlags.SetField | BindingFlags.SetProperty, null, null, null);
                }
            }            
        }
    

    不幸的是,即使没有设置某些属性,property != null也总是如此,所以即使没有设置某个字段,这个布尔值也会设置为true,这不是我想要的。

    我怎么能这样做呢?

    修改

    澄清,说我的肥皂体类型中有一个名为Birthdate的字段(这是一个日期时间),然后在WCF Web服务客户端代理中,还会有一个名为BirthDateSpecified的属性,如果设置了BirthDate,我需要设置为 true

1 个答案:

答案 0 :(得分:2)

因为您正在检查属性信息是否不是 null ,而不是property的值。您需要使用GetValue方法获取属性值,然后检查它是否为null。

if (property.GetValue(wsSoapBody,null) != null))
{
    pi.SetValue(wsSoapBody, true, BindingFlags.SetField | BindingFlags.SetProperty, null, null, null);
}