IEnumerable из Пользовательского класса и String.Join () - PullRequest
1 голос
/ 16 декабря 2010

Я создал класс, который действует как универсальный класс DataType. Я делаю это, потому что мне нужно сериализовать коллекцию объектов с ошибкой типизации в JSON, и я хотел бы иметь возможность создавать полный набор данных в виде коллекции. Вот так:

JSON.Serialize(new []
{
    new Chameleon("aDate", DateTime.Now),
    new Chameleon("aString", "FUBAR")
});

Ниже приведена упрощенная версия моей реализации:

class Chameleon
{
    private String _type;
    private String _key;
    private Object _value;

    public Chameleon(String key, String value)
    {
        _type = "string";
        _key = key;
        _value = value;
    }

    public Chameleon(String key, DateTime value)
    {
        _type = "string";
        _key = key;
        _value = value;
    }

    public new String ToString()
    {
        // returns internal data, formatted data according to _type
    }
}

Это все хорошо, но когда я пытаюсь присоединиться - или объединить, если хотите - коллекция Chameleon, использующая String.Join(), ToString() для объектов Chameleon в коллекции, не вызывается методом String.Join() ; вместо этого я получаю обычное возвращенное пространство имен + строка с именем класса.

Почему String.Join() не вызывает мою пользовательскую ToString() реализацию? Что мне не хватает?


Вот что я делаю:

JSON.Serialize(String.Join<Chameleon>(",", new []
{
    new Chameleon("aDate", DateTime.Now),
    new Chameleon("aString", "FUBAR")
}));

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Мне кажется, это происходит потому, что вы определяете ToString как new метод, а не переопределяете его. Попробуйте вместо этого код:

public override String ToString()
{
    // returns internal data, formatted data according to _type
}
2 голосов
/ 16 декабря 2010

Вот и все. Попробуйте определить свою ToString так:

  public override String ToString() //Note the override rather than new
  {
    //Format your string etc.
  }
0 голосов
/ 16 декабря 2010

Вам нужно поставить ToString на каждый Chameleon объект, иначе у вас будет массив Chameleon объекта вместо массива string, который следует использовать.

...