JavaScriptSerializer и ValueTypes (структура) - PullRequest
4 голосов
/ 23 февраля 2011

Для проекта я создал несколько структур в C #. Сам объект является проектом ASP.Net MVC 2.

чик:

struct TDummy
{
    private char _value;

    public TDummy(char value)
    {
         this._value = value; // Restrictions
    }
}

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

Теперь мне нужно создать JsonResult, например

return Json(new { Value = new TDummy('X') });

Но когда я это делаю, я получаю результат:

{"Value":{}}

Я ожидал получить результат

{"Value":"X"}

Я пробовал несколько вещей, например TypeConverter (CanConvertTo (string)), пользовательский сериализатор типов (JavaScriptSerializer.RegisterConverters ()), но либо они не работают, либо они должны возвращать «сложный» json-объект.

{"Value":{"Name":"Value"}}

Есть мысли по этому поводу?
Я хочу сериализовать тип значения как значение ...

1 Ответ

0 голосов
/ 24 февраля 2011

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

public struct TState
{
   public static TState Active = new TState('A');
   public static TState Pending = new TState('P');

   private char _value;

   public TState(char value)
   {
      switch (value)
      {
         case 'A':
         case 'P':
            this._value = value;  // Known values
            break;
         default:
            this._value = 'A';    // Default value
            break;
      }
   }

   public static implicit operator TState(char value)
   {
      switch (value)
      {
         case 'A':
            return TState.Active;
         case 'P':
            return TState.Pending;
      }
      throw new InvalidCastException();
   }

   public static implicit operator char(TState value)
   {
      return value._value;
   }

   public override string ToString()
   {
      return this._value.ToString();
   }
}

public class Test { public TState Value { get; set; } }

class Program
{
   static void Main(string[] args)
   {
      Test o = new Test();
      o.Value = 'P';               // From Char
      char c = o.Value;            // To Char
      Console.WriteLine(o.Value);  // Writes 'P'
      Console.WriteLine(c);        // Writes 'P'

      JavaScriptSerializer jser = new JavaScriptSerializer();
      Console.WriteLine(jser.Serialize(o));  // Writes '{"Value":{}}'

      Console.ReadLine();
   }
}
...