Почему некоторые свойства / поля видны в отладчике, но недоступны из кода?
Мне любопытно, почему я не могу получить доступ Attributes
из кода, но это отлично видно в отладчике?
Также кажется, что нет свойства / поля с именем "Атрибуты"
Ошибка:
"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