Вот моя реализация решения вашей проблемы. В принципе идея - это свойство, которое будет задано функцией при первом доступе, и последующие обращения приведут к тому же возвращенному значению, что и первое.
public class LazyProperty<T>
{
bool _initialized = false;
T _result;
public T Value(Func<T> fn)
{
if (!_initialized)
{
_result = fn();
_initialized = true;
}
return _result;
}
}
Затем, чтобы использовать:
LazyProperty<Color> _eyeColor = new LazyProperty<Color>();
public Color EyeColor
{
get
{
return _eyeColor.Value(() => SomeCPUHungryMethod());
}
}
Конечно, накладные расходы на передачу указателя функции, но он выполняет эту работу для меня, и я не замечаю слишком много накладных расходов по сравнению с запуском метода снова и снова.