Вам, конечно, здесь не нужно ничего связанного с IoC. Как насчет:
public T ActOnFile<T>(string filename, Func<Stream, T> func)
{
using (Stream stream = File.OpenRead(stream))
{
return func(stream);
}
}
public int CountLines(string filename)
{
return ActOnFile(filename, stream =>
{
using (StreamReader reader = new StreamReader(stream))
{
int count = 0;
while (reader.ReadLine() != null)
{
count++;
}
return count;
}
});
}
В этом случае это не очень помогает, поскольку оператор using
уже делает большую часть того, что вы хотите ... но общий принцип верен. Действительно, вот как LINQ настолько гибок. Если вы еще не смотрели на LINQ, я настоятельно рекомендую вам это сделать.
Вот метод, который я бы использовал act CountLines
:
public int CountLines(string filename)
{
return File.ReadLines(filename).Count();
}
Обратите внимание, что это все равно будет считывать только строку за раз ... но метод расширения Count
действует на возвращаемую последовательность.
В .NET 3.5 это будет:
public int CountLines(string filename)
{
using (var reader = File.OpenText(filename))
{
int count = 0;
while (reader.ReadLine() != null)
{
count++;
}
return count;
}
}
... все еще довольно просто.