在生成的部分类上使用XmlIgnore

时间:2009-06-10 13:24:42

标签: c# silverlight web-services attributes metadata

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

通常我会在那里抛出[XmlIgnore],但由于属性在生成的一半中,我无法做到。

我一直在考虑在this post之后使用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; }
}

我通过Silverlight项目中的ASP.NET Web服务引用它。

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

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

3 个答案:

答案 0 :(得分:11)

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

Refer this link了解更多信息

    // 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);

答案 1 :(得分:3)

MetadataTypeAttribute不支持AFAIK XmlSerializer(虽然它会很好 - 我根本就没检查过)。正如您所说,您无法在分部类中添加成员属性。

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

 [XmlIgnore]
 public object Timestamp {
     get {return TimestampStorage; }
     set {TimestampStorage = value; }
 }
 // and other properties

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

答案 2 :(得分:1)

我同意马克。最简单的方法是将它们标记为内部。或者,您可以使用[XmlIgnore]在分部类中重新公开它们。顺便说一下,您可以控制linq2sql设计器中属性的可访问性。进入属性对话框,您将看到设置它们的位置