背景:
我厌倦了在我的网络服务客户端中手动设置了几十个“_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 。
答案 0 :(得分:2)
因为您正在检查属性信息是否不是 null ,而不是property的值。您需要使用GetValue
方法获取属性值,然后检查它是否为null。
if (property.GetValue(wsSoapBody,null) != null))
{
pi.SetValue(wsSoapBody, true, BindingFlags.SetField | BindingFlags.SetProperty, null, null, null);
}