Обычное литье не работает - PullRequest
0 голосов
/ 11 декабря 2011

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

    public List<TResult> LoadFromeStreamFile<TResult>(string Location)
    {
        List<TResult> result = new List<TResult>();

        StreamReader reader = new StreamReader(Location);

        while (!reader.EndOfStream)
        {
            result.Add((TResult)reader.ReadLine());
        }

        reader.Close();

        return result;
    }

но у меня есть ошибка в этом коде result.Add((TResult)reader.ReadLine()); Как я могу разыграть string до TResult ??

Ответы [ 2 ]

8 голосов
/ 11 декабря 2011

Это приведение не может возможно работать, если TResult не равно object или string. Предполагая, что вы на самом деле пытаетесь создать что-то вроде сущности, я бы либо предложил вам передать Func<string, TResult> или (предпочтительно) использовать LINQ - так что вы не будете нужен этот метод вообще:

var list = File.ReadLines(location)
               .Select(line => new SomeEntity(line))
               .ToList();

Если вы все еще хотите метод, вы можете использовать:

public static List<TResult> LoadFromFile<TResult>(string location,
                                                  Func<string, TResult> selector)
{
    return File.ReadLines(location).Select(selector).ToList();
}

... но я не уверен, стоит ли это того. Я полагаю, если вы делаете это много ...

(В примечании, когда вам do необходимо прочитать из файла, вы должны использовать оператор using, чтобы дескриптор файла закрывался даже в случае возникновения исключения.)

0 голосов
/ 11 декабря 2011

Этого можно добиться, реализовав явный оператор преобразования типов в «TResult». Явное приведение от объекта к TResult.

Ссылка MSDN

Это на самом деле «в некотором роде» так же, как наличие конструктора в «TResult», который может создать конструктор из заданного объекта (с некоторыми допущениями).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...