Использование XmlIgnore для сгенерированных частичных классов - PullRequest
9 голосов
/ 10 июня 2009

У меня есть класс LINQ 2, сгенерированный SQL, который я хотел бы показать через веб-сервис. Есть некоторые внутренние свойства, которые я не хочу быть доступными.

Обычно я добавляю туда [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; }
}

Я ссылаюсь на это через веб-службу ASP.NET из проекта Silverlight.

Проблема в том, что атрибуты [XmlIgnore] игнорируются, через эти свойства отправляются.

Кто-нибудь знает, что здесь может пойти не так? и какой может быть лучший способ сделать это?

Ответы [ 3 ]

11 голосов
/ 01 ноября 2013

Вы можете сделать это, передав свои собственные 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);
3 голосов
/ 10 июня 2009

AFAIK, MetadataTypeAttribute не поддерживается 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 ... но это немного выдумка.

1 голос
/ 10 июня 2009

Я согласен с Марком. Проще всего пометить их как внутренние. При желании вы можете затем повторно представить их в частичном классе с помощью [XmlIgnore]. Кстати, вы можете контролировать доступность свойств в конструкторе linq2sql. Зайдите в диалог свойств, и вы увидите место для их установки

...