Как упоминалось "thelost", не имейте отдельного поля для каждого свойства. Храните словарь в качестве кэша, чтобы ничего не платить за свойства, к которым вы не обращались.
Я бы предложил вам метод, который вы можете предоставить с механизмом получения реального значения. Например:
public class Foo
{
private enum CacheKey
{
Bar, Baz, ...;
}
private readonly XDocument doc;
private readonly Dictionary<CacheKey, string> cache;
private string Fetch(CacheKey key, Func<XDocument, string> computation)
{
string result;
if (!cache.TryGetValue(key, out result))
{
result = computation(doc);
cache[key] = result;
}
return result;
}
public string Bar
{
get { return Fetch(CacheKey.Bar, doc => doc.Element("bar").Value); }
}
}
Таким образом, каждое свойство оказывается достаточно компактным - оно в основном выражает ключ кеша и способ вычисления свойства. Если вам нужны свойства разных типов, вы можете захотеть, чтобы в кеше было просто TValue
как object
, и сделать метод Fetch
универсальным, приводя при необходимости Это приведет к тому, что типы значений в боксе, по общему признанию.
Если вы используете этот подход в нескольких местах, вы, возможно, захотите создать общий класс ComputingCache
, чтобы избежать повторения логики.