c# 无法检查 属性 是否未设置
c# cannot check if property is not set
背景:
- WCF service proxy not setting "FieldSpecified" property
- MSDN Forums: parameter-names-ending-with-specified-added-to-web-service-method-call?forum=wcf
我受够了必须在我的 Web 服务客户端中手动设置几十个“_Specified”字段(对于 Struct
数据类型,如 Long 和 DateTime),所以我想我会尝试遍历我的 Soap Body 中的所有属性,如果它是一个名为 Specified 的布尔值,并且如果 属性(例如生日)已经设置,然后我可以将 属性 默认为 true。
所以我写了这段代码来循环,检查属性是否不为null,如果不为null,则设置相应的Specified 属性为真:
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
总是为真,所以即使一个字段没有被设置,这个布尔值被设置为真,这不是我想要的想要。
我怎样才能正确地做到这一点?
编辑:
澄清一下,假设我的 soap 主体类型中有一个名为 Birthdate
的字段(这是一个日期时间),那么在 WCF 网络服务客户端代理中也会有一个名为 属性 的字段 BirthDateSpecified
这就是我需要设置为 true 如果 BirthDate
已设置。
因为您正在检查 属性 信息是否不是 null,而不是 property.You 的值需要使用 GetValue
方法然后检查它是否为空。
if (property.GetValue(wsSoapBody,null) != null))
{
pi.SetValue(wsSoapBody, true, BindingFlags.SetField | BindingFlags.SetProperty, null, null, null);
}
背景:
- WCF service proxy not setting "FieldSpecified" property
- MSDN Forums: parameter-names-ending-with-specified-added-to-web-service-method-call?forum=wcf
我受够了必须在我的 Web 服务客户端中手动设置几十个“_Specified”字段(对于 Struct
数据类型,如 Long 和 DateTime),所以我想我会尝试遍历我的 Soap Body 中的所有属性,如果它是一个名为 Specified 的布尔值,并且如果 属性(例如生日)已经设置,然后我可以将 属性 默认为 true。
所以我写了这段代码来循环,检查属性是否不为null,如果不为null,则设置相应的Specified 属性为真:
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
总是为真,所以即使一个字段没有被设置,这个布尔值被设置为真,这不是我想要的想要。
我怎样才能正确地做到这一点?
编辑:
澄清一下,假设我的 soap 主体类型中有一个名为 Birthdate
的字段(这是一个日期时间),那么在 WCF 网络服务客户端代理中也会有一个名为 属性 的字段 BirthDateSpecified
这就是我需要设置为 true 如果 BirthDate
已设置。
因为您正在检查 属性 信息是否不是 null,而不是 property.You 的值需要使用 GetValue
方法然后检查它是否为空。
if (property.GetValue(wsSoapBody,null) != null))
{
pi.SetValue(wsSoapBody, true, BindingFlags.SetField | BindingFlags.SetProperty, null, null, null);
}