Моя библиотека использует несколько вложенных пространств имен, расположенных следующим образом:
Library name
Class name 1
Class name 2
Class name 3
[...]
Utilities
Class name 1
[...]
Class name 2
[...]
Class name 3
[...]
[...]
Пространство имен «Утилиты» содержит полезные расширения для каждого из классов, которые не гарантируют включения в сам класс.
Пространство имен «Имя библиотеки» необходимо, поскольку оно позволяет избежать широких конфликтов с другими библиотеками, Пространство имен «Utilities» необходимо, чтобы избежать неоднозначности, которая возникает из таких вещей , а пространство имен «Class name» внутри него позволяет избежать конфликтов имен между утилитами, написанными для подобных классов.
Несмотря на это, на практике это по-прежнему является огромной проблемой. Возьмем, к примеру, следующее:
MyLibrary::MyContainer Numbers = MyLibrary::Utilities::MyContainer::Insert(OtherContainer, 123, 456);
// Oh God, my eyes...
Это заставляет меня думать, что я делаю что-то серьезно неправильно. Есть ли более простой способ сохранить порядок? {public ...
У меня есть действие контроллера, определение которого выглядит как-
public ActionResult ChangeModel( IEnumerable info, long? destinationId)
И модель:
public class MyModel
{
public string Name; //Gets populated by default binder
public long? SourceId; //remains null though the value is set when invoked
}
Свойство 'Name' заполняется в действии контроллера, однако Свойство SourceId остается пустым. Также заполняется destinationId , который является параметром long? .
При пошаговом просмотре исходного кода MVC (версия 2) это исключение генерируется DefaultModelBinder.
Преобразование параметра из типа System.Int32 в тип 'System.Nullable`1 [[System.Int64, mscorlib, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]]' сбой, поскольку преобразователь типов не может преобразовать эти типы.
Если модель изменена на длинную, а не на длинную?, связыватель модели по умолчанию устанавливает значение.
public class MyModel
{
public string Name {get;set;}; //Gets populated by default binder
public long SourceId {get;set;}; //No longer long?, so value gets set
}
Это известная проблема? Поскольку исходный код MVC оптимизирован, я не могу выполнить пошаговое выполнение большей части кода.
Обновление: отправляемый запрос представляет собой Http POST с использованием Json с исходным JSon, напоминающим -
{"info":[{"Name":"CL1","SourceId":2}], "destinationId":"1"}