Объект броска к T

Используйте эту суть: https://gist.github.com/varun-raj/5350595a730a62ca1954

Замените

http://example.com/feeds?type=json

на ваш URL JSON

Добавьте сюда свои сущности

rows.push([data.id, data.name,data.email]);

79
задан Michael Myers 22 May 2009 в 19:41
поделиться

8 ответов

Сначала проверьте, можно ли его применить.

if (readData is T) {
    return (T)readData;
} 
try {
   return (T)Convert.ChangeType(readData, typeof(T));
} 
catch (InvalidCastException) {
   return default(T);
}
186
ответ дан 24 November 2019 в 10:05
поделиться

Вы пробовали Convert.ChangeType ?

Если метод всегда возвращает строку, которую я считаю странной, но помимо этого, возможно, этот измененный код будет делать то, что вы хотите:

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAsObject();
    return (T)Convert.ChangeType(readData, typeof(T));
}
17
ответ дан 24 November 2019 в 10:05
поделиться

попробуйте

if (readData is T)
    return (T)(object)readData;
7
ответ дан 24 November 2019 в 10:05
поделиться

Вы можете потребовать, чтобы тип был ссылочным:

 private static T ReadData<T>(XmlReader reader, string value) where T : class
 {
     reader.MoveToAttribute(value);
     object readData = reader.ReadContentAsObject();
     return (T)readData;
 }

А затем выполните другой тип, который использует типы значений и TryParse ...

 private static T ReadDataV<T>(XmlReader reader, string value) where T : struct
 {
     reader.MoveToAttribute(value);
     object readData = reader.ReadContentAsObject();
     int outInt;
     if(int.TryParse(readData, out outInt))
        return outInt
     //...
 }
3
ответ дан 24 November 2019 в 10:05
поделиться

Добавьте ограничение «класс» (или более подробно, например, базовый класс или интерфейс ваших исполняемых объектов T):

private static T ReadData<T>(XmlReader reader, string value) where T : class
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAsObject();
    return (T)readData;
}

или , где T: IMyInterface или , где T: new () и т. д.

1
ответ дан 24 November 2019 в 10:05
поделиться

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

2
ответ дан 24 November 2019 в 10:05
поделиться

На самом деле проблема здесь в использовании ReadContentAsObject. К сожалению, этот метод не оправдывает ожиданий; хотя он должен определять наиболее подходящий тип значения, он фактически возвращает строку, независимо от того, что (это можно проверить с помощью Reflector).

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

Попробуйте вместо этого использовать ReadContentAs, это именно то, что вам нужно.

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAs(typeof(T), null);
    return (T)readData;
}
3
ответ дан 24 November 2019 в 10:05
поделиться

На самом деле, ответы поднимают интересный вопрос: что вы хотите, чтобы ваша функция выполняла в случае ошибки.

Может быть, было бы разумнее сконструировать ее в форме метода TryParse, который пытается читать в T, но возвращает false, если это невозможно?

    private static bool ReadData<T>(XmlReader reader, string value, out T data)
    {
        bool result = false;
        try
        {
            reader.MoveToAttribute(value);
            object readData = reader.ReadContentAsObject();
            data = readData as T;
            if (data == null)
            {
                // see if we can convert to the requested type
                data = (T)Convert.ChangeType(readData, typeof(T));
            }
            result = (data != null);
        }
        catch (InvalidCastException) { }
        catch (Exception ex)
        {
            // add in any other exception handling here, invalid xml or whatnot
        }
        // make sure data is set to a default value
        data = (result) ? data : default(T);
        return result;
    }

edit: теперь, когда я думаю об этом, действительно ли мне нужно проводить тест convert.changetype? Разве строка as уже не пытается это сделать? Я не уверен, что этот дополнительный вызов changetype на самом деле что-то дает. Фактически, это может просто увеличить накладные расходы на обработку, создав исключение. Если кто-то знает, почему это стоит того, напишите нам!

1
ответ дан 24 November 2019 в 10:05
поделиться
Другие вопросы по тегам:

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