Почему некоторые свойства / поля видны в отладчике, но недоступны из кода?

Мне любопытно, почему я не могу получить доступ Attributes из кода, но это отлично видно в отладчике?

Также кажется, что нет свойства / поля с именем "Атрибуты"

ModelMetadata Class

Ошибка:

"ModelMetadata" не содержит определения "Атрибуты", и нет доступного метода расширения "Атрибуты", принимающего первый аргумент типа "ModelMetadata" (вы пропустили директиву using или ссылку на сборку?)

Код:

using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
using System;
using System.Linq.Expressions;

namespace Project.Views
{
    public static class HtmlExtensions
    {
        public static IHtmlContent DescriptionFor<TModel, TValue>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
        {
            if (html == null) throw new ArgumentNullException(nameof(html));
            if (expression == null) throw new ArgumentNullException(nameof(expression));

            var modelExplorer = ExpressionMetadataProvider.FromLambdaExpression(expression, html.ViewData, html.MetadataProvider);
            if (modelExplorer == null) throw new InvalidOperationException($"Failed to get model explorer for {ExpressionHelper.GetExpressionText(expression)}");

            var resolvedDisplayName = modelExplorer.Metadata.Attributes ?? modelExplorer.Metadata.PropertyName;

            return new HtmlString(resolvedDisplayName ?? string.Empty);
        }
    }
}

1 ответ

Решение

ModelExplorer.Metadata свойство, к которому вы обращаетесь, имеет тип ModelMetadata, Если вы посмотрите на этот тип, вы увидите, что он не имеет Attributes член, к которому вы могли бы получить доступ.

Тем не менее, тип времени выполнения объекта, который находится в modelExplorer.Metadata это тип DefaultModelMetadata который имеет Attributes член.

Поскольку отладчик заботится только о типах среды выполнения, вы можете получить доступ к этому свойству. Но когда вы пытаетесь сделать это в коде, вы ограничены типами времени компиляции. Вы должны будете сначала привести тип, чтобы получить доступ к Attributes имущество:

ModelMetadata metadata = modexlExplorer.Metadata;
// metadata.Attributes does not exist

DefaultModelMetadata defaultMetadata = (DefaultModelMetadata) metadata;
// defaultMetadata.Attributes exists
Другие вопросы по тегам