2016-05-17 2 views
0

Я пытаюсь инициализировать объект для сериализации, объект класса был создан с использованием xsd.exe. Отдельные свойства могут быть инициализированы без проблем, но при попытке инициализации в «неограниченное» свойстве XSD я не могу использовать цикл Еогеаспа перейти каждое значение в массиве и добавить, что к объекту:Недопустимый термин выражения 'foreach'

 object[] test = new object[0]; 

     test[0] = "ring"; 

     export export = new export(); 

     export.info = new exportInfo 
     { 
      dateandtimeofexport = DateTime.Now, 
      duration = "10", 
      planningsoftware = new exportInfoPlanningsoftware 
      { 
       name = "", 
       major = "", 
       minor = "", 
       revision = "", 
       build = "" 
      }, 
      exporter = new exportInfoExporter 
      { 
       version = new exportInfoExporterVersion 
       { 
        name = "", 
        major = "", 
        minor = "", 
        revision = "", 
        build = "" 
       }, 
       module = new exportInfoExporterModule[] 
       { 
        foreach(Object x in test) 
        { 
        new exportInfoExporterModule{name = x.name, major = x.major, minor = x.minor, revision = x.revision, build = x.build;} 
        } 
       } 
      } 
     }; 

I думаю, главная проблема здесь в том, что я понимаю, как именно инициализировать массив объектов под классом объектов, созданный из моего XSD, используя XSD.exe, может ли кто-нибудь сообщить, как это можно сделать без цикла foreach?

Любые рекомендации очень ценятся.

ответ

-1

Чтобы иметь возможность использовать foreach, вы должны выполнять итерацию на контейнере, реализующем интерфейс IEnumerable.

Это не относится к простому массиву. Просто преобразуйте тест в список (List реализует IEnumerable), и он должен работать.

List<object> test = new List<object>(); 
+0

или более короткая снова 'foreach (объект x в test.ToList())' –

+2

Простые массивы, безусловно, могут быть повторены с 'foreach'. Это потрясающе, а не в хорошем смысле, что этот ответ получил два оборота. Проблема OP заключается в том, что 'foreach' не допускается внутри инициализатора массива,' = new exportInfoExporterModule [] {...} ', а не' 'foreach' не поддерживает массивы. – GSerg

+0

Спасибо, ребята, но проблема здесь в том, что foreach не может использоваться в показанном контексте. Кажется, что только базовая структура класса (созданная xsd.exe) может быть использована, и в этой инициализации объекта нет операций. –

1

Первые две строки вашего кода приведут к исключению во время выполнения, поскольку вы пытаетесь поместить значение в массив нулевой длины.

object[] test = new object[0]; 
test[0] = "ring"; 

исключение времени выполнения (линия 1): Индекс находился вне границ массива.

Здесь .NET Fiddle, чтобы показать это.

Итерация по массиву через foreach полностью прекрасна! Но проблема в том, что цикл находится внутри инициализатора объекта. Это запрещено, вместо этого используйте Linq с .Select и .ToArray().

module = test.Select(t => new exportInfoExporterModule { name = t }) 
      .ToArray(); 
3
module = test.Select(t => new exportInfoExporterModule{name = t}).ToArray() 

вместо

module = new exportInfoExporterModule[] 
      { 
       foreach(Object x in test) 
       { 
       new exportInfoExporterModule{name = x} 
       } 
      } 

должен сделать трюк. Изучите некоторые LINQ, чтобы узнать, что здесь произошло;)

5

Ваш код недействителен C#. Вы не можете использовать foreach внутри инициализатора массива.

// NOT VALID C# CODE! 
module = new exportInfoExporterModule[] 
{ 
    foreach(Object x in test) 
    { 
     new exportInfoExporterModule{name = x} 
    } 
} 

Это невозможно, потому что foreach является заявления, но intializer массива ожидает выражения, что приводит к exportInfoExportedModule.

Что вы можете сделать вместо этого что-то вроде этого:

module = test.Select(x => new exportInfoExporterModule{name = x}).ToArray() 

Но обратите внимание, что в начале кода вы создаете массив test с длиной 0, а затем попытаться установить "ring", как его первая (из ноль) элементы! Это дает IndexOutOfRangeException. Инициализировать test вроде:

object[] test = new object[] {"ring"}; 
3

Вы не можете использовать цикл в пределах инициализатора.

Смотрите, если вы можете инициализировать массив после вы построили остальную часть объекта:

export.info = new exportInfo 
{ 
     // ... 
     version = new exportInfoExporterVersion 
     { 
      name = "", 
      major = "", 
      minor = "", 
      revision = "", 
      build = "" 
     } 
    } 
}; 

export.info.exporter.module = new exportInfoExporterModule[test.Length]; 

for (int i = 0; i < test.Length; i++) 
{ 
    export.info.exporter.module[i] = new exportInfoExporterModule 
    { 
     name = test[i].name, 
     major = test[i].major, 
     minor = test[i].minor, 
     build = test[i].build, 
     revision = test[i].revision 
    }; 
} 

Или, с помощью LINQ:

export.info = new exportInfo 
{ 
     // ... 
     version = new exportInfoExporterVersion 
     { 
      name = "", 
      major = "", 
      minor = "", 
      revision = "", 
      build = "" 
     }, 
     module = test.Select(x => new exportInfoExporterModule 
     { 
      name = x.name, 
      major = x.major, 
      minor = x.minor, 
      build = x.build, 
      revision = x.revision 
     }).ToArray() 
    } 
}; 
+0

Спасибо BoltClock, я очень новичок в этом, так что немного споткнулся. Это похоже на решение, но перед тем, как я прочитал LINQ дальше, вы могли бы посоветовать, как я могу использовать метод LINQ для создания нового exportInfoExporterModule, где exportInfoExporterModule имеет не просто имя, а имя, версию, майор, младший? –

+0

@ Dan Hall: Точно так же вы создали новую exportInfoExporterVersion, хотя, конечно, вам нужно будет изменить x на фактическое значение (ы), которое вы сериализуете. Вы можете отредактировать свой вопрос, чтобы включить фактический объект (ы), который будет сериализован, чтобы мы имели некоторые более конкретные данные для работы. – BoltClock

+0

Спасибо, я немного обновил код в своем вопросе, чтобы показать, что я пытаюсь сделать. Что я не понимаю, так это пример LINQ, что означает x? Мне интересно, как этот пример можно расширить, чтобы создать объект exportInfoExporterModule с другими свойствами. –

0

Вы должны создать массив, хотите назначить перед созданием объекта-экспортера.

Другим способом может быть использование Linq для назначения модуля. Что-то вроде module = test.Select(x => new exportInfoExporterModule{name = x}).ToArray() должно работать.

Смежные вопросы