Как я могу определить доступные значения для завершения кода свойства строки в C # таким образом, что MongoDB.BsonSerializer поймет? - PullRequest
0 голосов
/ 11 декабря 2018

Основная цель - показать intellisense при настройке свойства.Было бы здорово, если бы я мог сделать это с помощью атрибута, подобного изображению ниже.

Свойство должно оставаться строкой (не перечислением или структурой), чтобы BsonSerializer Mongo мог его правильно сериализовать.Вот пример того, как это может выглядеть:

enter image description here

Чтобы помочь другим разработчикам в команде узнать возможные (но не исключительные) значения, которые они могут использоватьдля поля Тип Завершение кода должны отображаться значения, которые можно использовать, как показано ниже:

enter image description here

1 Ответ

0 голосов
/ 12 декабря 2018

(Отредактировано) Я смог решить эту проблему, создав собственный тип

public class SkinType:StringType<SkinType>
{
    public SkinType(string value)
    {
        Value = value;
    }
    public SkinType()
    {

    }
    public static implicit operator string(SkinType d)
    {
        return d.Value;

    }
    public static implicit operator SkinType(string d)
    {
        return  new SkinType(d);
    }

    public const string StringValue = nameof(StringValue);
    public const string Color = nameof(Color);
}

Теперь я получил intellisense для своего свойства Type, и Mongo знает, как его сериализовать.

Воткак я это использую:

    public class Skin : ServiceMongoIdentity
{

     //removed some properties for brevity.
    [BsonIgnoreIfDefault]
    [BsonDefaultValue(SkinType.StringValue)]
    public SkinType Type { get; set; } = SkinType.StringValue;

}

Вот как определяется базовый класс StringType.Мне пришлось сделать Value общедоступным, потому что у Generics не может быть конструкторов с параметрами

 public abstract  class StringType<T> where T :StringType<T>,new()
{
    [ReadOnly(true)]
    public string Value;
    public T FromString(string d)
    {
        return  new T
        {
            Value = d
        };

    }
    public override bool Equals(object obj)
    {
        return obj?.ToString() == Value;

    }

    public override int GetHashCode()
    {

        return Value.GetHashCode();
    }

    public override string ToString()
    {

        return Value;
    }

}
...