| File: ViewDataInfo.cs | Web Access |
| Project: src\aspnetcore\src\Mvc\Mvc.ViewFeatures\src\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj (Microsoft.AspNetCore.Mvc.ViewFeatures) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Reflection; namespace Microsoft.AspNetCore.Mvc.ViewFeatures; /// <summary> /// Represents info about a <see cref="ViewDataDictionary"/> lookup which is evaluated when <see cref="Value"/> is read. /// </summary> public class ViewDataInfo { private static readonly Func<object> _propertyInfoResolver = () => null; private object _value; private Func<object> _valueAccessor; /// <summary> /// Initializes a new instance of the <see cref="ViewDataInfo"/> class with info about a /// <see cref="ViewDataDictionary"/> lookup which has already been evaluated. /// </summary> /// <param name="container">The <see cref="object"/> that <paramref name="value"/> was evaluated from.</param> /// <param name="value">The evaluated value.</param> public ViewDataInfo(object container, object value) { Container = container; _value = value; } /// <summary> /// Initializes a new instance of the <see cref="ViewDataInfo"/> class with info about a /// <see cref="ViewDataDictionary"/> lookup which is evaluated when <see cref="Value"/> is read. /// It uses <see cref="System.Reflection.PropertyInfo.GetValue(object)"/> on <paramref name="propertyInfo"/> /// passing parameter <paramref name="container"/> to lazily evaluate the value. /// </summary> /// <param name="container">The <see cref="object"/> that <see cref="Value"/> will be evaluated from.</param> /// <param name="propertyInfo">The <see cref="PropertyInfo"/> that will be used to evaluate <see cref="Value"/>.</param> public ViewDataInfo(object container, PropertyInfo propertyInfo) : this(container, propertyInfo, _propertyInfoResolver) { } /// <summary> /// Initializes a new instance of the <see cref="ViewDataInfo"/> class with info about a /// <see cref="ViewDataDictionary"/> lookup which is evaluated when <see cref="Value"/> is read. /// It uses <paramref name="valueAccessor"/> to lazily evaluate the value. /// </summary> /// <param name="container">The <see cref="object"/> that has the <see cref="Value"/>.</param> /// <param name="propertyInfo">The <see cref="PropertyInfo"/> that represents <see cref="Value"/>'s property.</param> /// <param name="valueAccessor">A delegate that will return the <see cref="Value"/>.</param> public ViewDataInfo(object container, PropertyInfo propertyInfo, Func<object> valueAccessor) { Container = container; PropertyInfo = propertyInfo; _valueAccessor = valueAccessor; } /// <summary> /// Gets the <see cref="object"/> that has the <see cref="Value"/>. /// </summary> public object Container { get; } /// <summary> /// Gets the <see cref="PropertyInfo"/> that represents <see cref="Value"/>'s property. /// </summary> public PropertyInfo PropertyInfo { get; } /// <summary> /// Gets the value of the property. /// </summary> public object Value { get { if (_valueAccessor != null) { ResolveValue(); } return _value; } set { _value = value; _valueAccessor = null; } } private void ResolveValue() { if (ReferenceEquals(_valueAccessor, _propertyInfoResolver)) { _value = PropertyInfo.GetValue(Container); } else { _value = _valueAccessor(); } _valueAccessor = null; } }