我有一个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]属性,正在发送这些属性。
有没有人对这里可能出现的问题有任何见解?什么可能是最好的方法呢?
答案 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
(虽然它会很好 - 我根本就没检查过)。正如您所说,您无法在分部类中添加成员属性。
一个选项可能是使生成的属性非公开(private
,protected
或internal
) - 并将其命名为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设计器中属性的可访问性。进入属性对话框,您将看到设置它们的位置