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

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

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

ModelMetadata Class

enter image description here

Ошибка:

«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 Ответ

2 голосов
/ 27 марта 2019

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

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

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

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

DefaultModelMetadata defaultMetadata = (DefaultModelMetadata) metadata;
// defaultMetadata.Attributes exists
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...