在生成的部分类上使用XmlIgnore

Tri*_*ith 9 c# silverlight attributes web-services metadata

我有一个LINQ 2 SQL生成的类,我想通过Web服务公开.我不希望有一些内部属性.

通常我会在那里抛出[XmlIgnore]但是因为属性在生成的一半中我不能这样做.

我一直在寻找使用MetadataType的帖子,看起来应该允许我在另一个类中定义属性属性.

我的代码看起来像这样:

[MetadataType(typeof(ProspectMetaData))]
public partial class Prospect : ApplicationBaseObject
{
}

public class ProspectMetaData
{
     [XmlIgnore]
     public object CreatedDateTime { get; set; }

     [XmlIgnore]
     public object AmendedDateTime { get; set; }

     [XmlIgnore]
     public object Timestamp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我通过Silverlight项目中的ASP.NET Web服务引用了这个.

问题是忽略了[XmlIgnore]属性,正在发送这些属性.

有没有人对这里可能出现的问题有任何见解?什么可能是最好的方法呢?

Ash*_*Ash 11

您可以通过将自己的XmlAttributeOverrides传递给XmlSerializer来实现这一点,在XmlAttributeOverrides中,您可以将XmlIgnore更改为您希望的字段/属性的true而不触及DBML生成的代码,并且它像魅力一样工作,使用相同的覆盖来反序列化为好...

有关更多信息,请参阅此链接

    // Create the XmlAttributeOverrides and XmlAttributes objects.
    XmlAttributeOverrides xOver = new XmlAttributeOverrides();

    XmlAttributes attrs = new XmlAttributes();
    attrs.XmlIgnore = true;

    /* Setting XmlIgnore to true overrides the XmlIgnoreAttribute
        applied to the following fields. Thus it will be serialized.*/
    xOver.Add(typeof(Prospect), "CreatedDateTime", attrs);
    xOver.Add(typeof(Prospect), "AmendedDateTime", attrs);
    xOver.Add(typeof(Prospect), "Timestamp", attrs);

    XmlSerializer xSer = new XmlSerializer(typeof(Prospect), xOver);
    TextWriter writer = new StreamWriter(outputFilePath);
    xSer.Serialize(writer, object);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 4

AFAIK,MetadataTypeAttribute不支持XmlSerializer(虽然这会很好 - 我只是从未检查过)。正如您所说,您无法在分部类中添加成员属性。

一种选择可能是使生成的属性成为非公共的(privateprotectedinternal) - 并将其命名为类似TimestampStorage(etc) - 然后在公共 API 上重新公开它们(在分部类中):

 [XmlIgnore]
 public object Timestamp {
     get {return TimestampStorage; }
     set {TimestampStorage = value; }
 }
 // and other properties
Run Code Online (Sandbox Code Playgroud)

(因为XmlSerializer只查看公共 API)。这里最大的问题是 LINQ-to-SQL 查询(Where等)只能针对生成的列(TimestampStorage等)起作用。我之前曾对成员 as 使用过这种方法internal,允许我的 DAL 类使用该internal属性...但这有点胡编乱造。