Инстанцирование анонимного объекта с помощью C# возражает синтаксису инициализатора, сохраненному в строке

В C перечисления используются без префикса типа, поэтому вы пишете:

month[0] = January;  
month[4] = May;

Перечисление Month и ShortMonth имеют одинаковую область видимости, поэтому компилятор не может знать, какой May использовать. Очевидным решением будет префикс перечислений, но я не уверен, что использование этих перечислений в этом случае оправдано.

9
задан DSO 22 May 2009 в 20:57
поделиться

5 ответов

Анонимные классы представляют собой синтаксический сахар C # (см. Раздел примечаний здесь ). csc.exe создает класс с частными полями и свойством чтения / записи с типом, выведенным из контекста.

Это означает, что вы не можете создать анонимный класс во время выполнения, потому что CLR видит их не иначе, чем любой другой класс (опять же, потому что это синтаксический сахар C #).

Вместо этого:

  • Используйте Dictionary
  • Используйте JSON.NET, XML или что-то подобное, в котором есть уже определенная схема синтаксического анализа строки для получения объекта. Однако для этого требуется, чтобы свойства были четко определены.
  • Используйте System.Reflection.Emit для создания типа во время выполнения, но я не вижу в этом никакой реальной выгоды по сравнению с просто Dictionary <строка, object>

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

17
ответ дан 4 December 2019 в 07:24
поделиться

Невозможно использовать анонимные типы, однако вы можете сделать это с помощью Reflection Emit, используя класс TypeBuilder, в частности TypeBuilder.Create (..).

http://msdn.microsoft. com / en-us / library / system.reflection.emit.typebuilder.createtype.aspx

5
ответ дан 4 December 2019 в 07:24
поделиться

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

Инициализатор вашего объекта не обязательно должен содержать постоянные значения.

string myName="bob";
int myAge=30;
double mySalary=100000;

object empData = new { name = myName, age = myAge, salary = mySalary };

Таким образом, в вашем сценарии вам придется анализировать отдельные элементы из вашей строки , и выполнить некоторые преобразования для них, чтобы привести их к нужным вам типам.

Если вы не связаны с этим конкретным строковым форматом, вы можете сериализовать и десериализовать свои объекты и сделать то же самое с помощью XML гораздо проще.

5
ответ дан 4 December 2019 в 07:24
поделиться

Я не думаю, что этот вопрос сам по себе отвечает на ваш вопрос, но он расскажет вам, почему невозможно создавать анонимные экземпляры объектов с использованием строк таким образом, как вы предлагаете:

Как создать новый экземпляр анонимного класса, переданного в качестве параметра в C #, и получить к нему доступ?

Анонимные типы не имеют публичных полей, следовательно, хотя вы можете сделать это для именованного объекта, это не так просто сделать это для анонимного типа. Тем не менее, вам ничто не мешает [как предлагает BFree] использовать отражение для выдачи MSIL для анонимного типа - что не совсем просто, но и возможно.

1
ответ дан 4 December 2019 в 07:24
поделиться

Нет прямого простого способа сделать это. Обычно у вас есть следующие возможности:

  1. Анализировать строку вручную.
  2. Используйте компилятор C # для компиляции этого объекта как части сборки и используйте отражение для определения содержимого.
  3. (не уверен, возможно ли это. , Только C # 4.0): используйте классы управляемого компилятора C # 4.0 для анализа выражения и вывода материала.

На мой взгляд, ни один из них не идеален. Я бы рассмотрел QueryString как пары, XML или JSON или какой-либо другой формат, в котором есть доступные парсеры, если у вас есть возможность и подумайте о хранении данных в экземпляре словаря вместо создания объекта для каждого выражения.

2
ответ дан 4 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

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