Инициализация списка С# с использованием списка вместо списка инициализации

Моя проблема касается синтаксиса синтаксиса инициализации объекта в C#, в частности синтаксиса для инициализации свойства списка.

JSchema библиотеки Newtonsoft .NET Schema предоставляет свойство с именем Enum, которое является IList<JToken>, и я хочу использовать инициализацию объекта для инициализации экземпляра такого класса JSchema. Чтобы инициализировать это свойство, я должен использовать список JToken с именем enumStrings.

К сожалению, поле Enum доступно только для чтения, поскольку оно содержит только get, как видно из JSchema.Enum.

//The list containing the values i want to use for initialization
List<JToken> enumString = ...

var schema = new JSchema
{
    Type = JSchemaType.Object,
    Properties =
    {
        { "EnumLabel", new JSchema
        {
            Type = JSchemaType.String,
            Enum = { listaenum } //ERROR: it expects a JToken not a List<JToken>
        } }
    }
};

Я также не могу использовать следующее решение, потому что свойство Enum доступно только для чтения:

Properties =
    {
        { "EnumLabel", new JSchema
        {
            Type = JSchemaType.String,
            Enum = new List<JToken>(enumStrings) //ERROR: a property without setter or inaccessible setter cannot be assigned to
        } }
    }

Любое предложение сделать это? Значения содержатся только в enumStrings и всегда изменяются, поэтому их можно жестко запрограммировать в инициализаторе объекта.


person Andorath    schedule 27.02.2018    source источник
comment
Enum является свойством только для чтения в JSchema, а JSchema имеет только открытый конструктор без параметров. Я не могу ответить на ваш вопрос прямо сейчас, но ясно, что вам придется искать в другом направлении, потому что этот метод построения не будет компилироваться.   -  person Zoran Horvat    schedule 27.02.2018
comment
Глядя на документацию, кажется, что нет способа изменить Enum. Мне интересно, есть ли синтаксис для инициализации свойств списка с использованием коллекций вместо инициализатора списка. Я не настолько эксперт в C#.   -  person Andorath    schedule 27.02.2018
comment
Второй фрагмент кода — правильный синтаксис инициализации списка, учитывая, что у вас уже есть коллекция. Однако Enum нельзя изменить на JSchema, и я не знаю, как правильно его инициализировать. Может быть, вы могли бы попробовать с классом JSchemaGenerator, но мне это не нравится.   -  person Zoran Horvat    schedule 27.02.2018
comment
Невероятный. Я не понимаю, почему это свойство доступно только для чтения. Самое смешное, что с первым синтаксисом меня не ругает, если я привожу список значений. Существует ли какая-либо деструктуризация для списка, которая подходит там, где требуется инициализация списка?   -  person Andorath    schedule 27.02.2018
comment
@BarrJ Я не видел твоего ответа и не проголосовал за твой ответ.   -  person Andorath    schedule 27.02.2018
comment
@BarrJ Похоже, вы перепутали a C# enum со свойством , которое называется Enum.   -  person Rawling    schedule 27.02.2018


Ответы (1)


Инициализаторы коллекций вызвать Add метод или метод расширения для значения свойства.

Попробуйте создать метод расширения:

public static class CollectionInitializerExtensionMethods
{
    public static void Add(this IList<JToken> list, IList<JToken> toAdd)
    {
         foreach (var a in toAdd)
         {
             list.Add(a);
         }
    }
}

В противном случае просто создайте объект schema, затем найдите свое свойство и вызовите для него AddRange вручную.

person Rawling    schedule 27.02.2018