Unity nullable integer как поле инспектора [duplicate]

Если GetData возвращает IList, измените e.Data.GetData(DataFormats.FileDrop)(0) на e.Data.GetData(DataFormats.FileDrop)[0]

84
задан dbc 20 December 2016 в 05:46
поделиться

6 ответов

XmlSerializer поддерживает шаблон ShouldSerialize{Foo}(), поэтому вы можете добавить метод:

public bool ShouldSerializeID() {return ID.HasValue;}

Существует также шаблон {Foo}Specified - не уверен, поддерживает ли XmlSerializer этот.

142
ответ дан Marc Gravell 20 August 2018 в 12:47
поделиться
  • 1
    XmlSerializer также поддерживает шаблон [Foo} Specified. – David Schmitt 4 March 2009 в 14:47
  • 2
    Страница релевантности находится здесь: msdn.microsoft.com/en-us/library/53b8022e%28VS.71%29.aspx – cbp 8 January 2010 в 07:31
  • 3
    Любой способ использования ShouldSerialize & lt; prop & gt; с автогенерируемыми свойствами? т.е. нет локальной переменной. – Jay 15 July 2010 в 16:20
  • 4
    @ Джей: Нет необходимости в одном. Вы можете просто вызвать HasValue в свойстве. – Steven Sudit 16 August 2010 в 19:06
  • 5
    @mark, если для члена (свойство / поле) Foo у вас также есть public bool FooSpecified {get {...} set {...}}, то get используется, чтобы видеть, следует ли сериализовать Foo, и вызывается set при назначении значения до Foo во время десериализации. – Marc Gravell♦ 20 September 2011 в 11:25

Я использую этот микро-шаблон для реализации Nullable serialization:

[XmlIgnore]
public double? SomeValue { get; set; }

[XmlAttribute("SomeValue")] // or [XmlElement("SomeValue")]
[EditorBrowsable(EditorBrowsableState.Never)]
public double XmlSomeValue { get { return SomeValue.Value; } set { SomeValue= value; } }  
[EditorBrowsable(EditorBrowsableState.Never)]
public bool XmlSomeValueSpecified { get { return SomeValue.HasValue; } }

Это обеспечивает правильный интерфейс для пользователя без компромиссов и по-прежнему делает правильную вещь при сериализации.

24
ответ дан David Schmitt 20 August 2018 в 12:47
поделиться
  • 1
    Поскольку SomeValue может быть null ... public double XmlSomeValue {get {return SomeValue.HasValue? SomeValue.Value: 0; } set {SomeValue = значение; }} – Doug Domeny 5 June 2009 в 12:56
  • 2
    XmlSomeValue предполагается использовать только XmlSerializer, который будет касаться только тогда, когда XmlSomeValueSpecified является истинным (т. Е. SomeValue.Value не является нулевым. – David Schmitt 5 June 2009 в 13:02
  • 3
    Гросс, но он сделал трюк. +1 – pettys 29 November 2010 в 23:36
  • 4
    @pettys: Это XML, чего вы ожидаете? ;-) – David Schmitt 27 October 2012 в 08:21
  • 5
    @DavidSchmitt LOL. Да, ты прав. – pettys 30 November 2012 в 17:51

Очень полезная публикация очень помогла.

Я решил перейти с версией Скотта к типу данных Nullable (Of T), однако отправленный код все еще сериализует элемент Nullable, когда он является Null - хотя и без атрибут «xs: nil =« true ».

Мне нужно было заставить сериализатор полностью отказаться от тега, поэтому я просто реализовал IXmlSerializable в структуре (это в VB, но вы получаете изображение):

  '----------------------------------------------------------------------------
  ' GetSchema
  '----------------------------------------------------------------------------
  Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
    Return Nothing
  End Function

  '----------------------------------------------------------------------------
  ' ReadXml
  '----------------------------------------------------------------------------
  Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
    If (Not reader.IsEmptyElement) Then
      If (reader.Read AndAlso reader.NodeType = System.Xml.XmlNodeType.Text) Then
         Me._value = reader.ReadContentAs(GetType(T), Nothing)
      End If
    End If
  End Sub

  '----------------------------------------------------------------------------
  ' WriteXml
  '----------------------------------------------------------------------------
  Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
    If (_hasValue) Then
      writer.WriteValue(Me.Value)
    End If
  End Sub

Я предпочитаю этот метод использовать (foo) Specified pattern, поскольку для этого требуется добавить к моим объектам нагрузки избыточных избыточных свойств, тогда как использование нового типа Nullable требует повторного набора свойств.

1
ответ дан James Close 20 August 2018 в 12:47
поделиться

Я выяснил обходное решение, использующее два свойства. Int? свойство с атрибутом XmlIgnore и свойство объекта, которое сериализуется.

    /// <summary>
    /// Score db record
    /// </summary>        
    [System.Xml.Serialization.XmlIgnore()]
    public int? ID 
    { 
        get 
        { 
            return iID_m; 
        } 
        set 
        { 
            iID_m = value; 
        } 
    }

    /// <summary>
    /// Score db record
    /// </summary>        
    [System.Xml.Serialization.XmlElement("ID",IsNullable = false)]
    public object IDValue
    {
        get
        {
            return ID;
        }
        set
        {
            if (value == null)
            {
                ID = null;
            }
            else if (value is int || value is int?)
            {
                ID = (int)value;
            }
            else
            {
                ID = int.Parse(value.ToString());
            }
        }
    }
12
ответ дан Jeremy 20 August 2018 в 12:47
поделиться
  • 1
    Это решение замечательно, так как оно также позволяет кодировать NULL как "placeholder" значение для клиентов, которые не распознают NULL в int, т. е. Flex. – Kuba Wyrostek 25 June 2013 в 10:01

Ничего себе, этот вопрос / ответ действительно помог мне. I сердце Stackoverflow.

Я сделал то, что вы делаете выше немного более общего. Все, что мы действительно ищем, - это иметь Nullable со слегка отличающимся по порядку сериализации. Я использовал Reflector для создания собственного Nullable и добавил несколько вещей здесь и там, чтобы сделать сериализацию XML так, как мы хотим. Кажется, что он работает очень хорошо:

public class Nullable<T>
{
    public Nullable(T value)
    {
        _value = value;
        _hasValue = true;
    }

    public Nullable()
    {
        _hasValue = false;
    }

    [XmlText]
    public T Value
    {
        get
        {
            if (!HasValue)
                throw new InvalidOperationException();
            return _value;
        }
        set
        {
            _value = value;
            _hasValue = true;
        }
    }

    [XmlIgnore]
    public bool HasValue
        { get { return _hasValue; } }

    public T GetValueOrDefault()
        { return _value; }
    public T GetValueOrDefault(T i_defaultValue)
        { return HasValue ? _value : i_defaultValue; }

    public static explicit operator T(Nullable<T> i_value)
        { return i_value.Value; }
    public static implicit operator Nullable<T>(T i_value)
        { return new Nullable<T>(i_value); }

    public override bool Equals(object i_other)
    {
        if (!HasValue)
            return (i_other == null);
        if (i_other == null)
            return false;
        return _value.Equals(i_other);
    }

    public override int GetHashCode()
    {
        if (!HasValue)
            return 0;
        return _value.GetHashCode();
    }

    public override string ToString()
    {
        if (!HasValue)
            return "";
        return _value.ToString();
    }

    bool _hasValue;
    T    _value;
}

Вы теряете возможность иметь своих членов как int? и т. д. (вместо этого нужно использовать Nullable & lt; int & gt;), но кроме этого все поведение остается неизменным.

6
ответ дан scobi 20 August 2018 в 12:47
поделиться
  • 1
    Это накладывает на меня System.ExecutionEngineException на XmlSerializer.Serialize. – modiX 9 May 2014 в 08:41

К сожалению, описанные вами поведения точно документированы как таковые в документах для XmlElementAttribute.IsNullable.

1
ответ дан Serge Wautier 20 August 2018 в 12:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: