为什么某些属性/字段在调试器中可见,但是无法从代码中访问?

时间:2019-03-27 09:33:04

标签: c# visual-studio asp.net-core

我很好奇,为什么我不能从代码中访问Attributes,但在调试器中却完全可见?

似乎还没有一个名为“属性”的属性/字段

ModelMetadata Class

enter image description here

错误:

  

'ModelMetadata'不包含'Attributes'的定义,并且找不到可以接受的扩展方法'Attributes'接受类型为'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 个答案:

答案 0 :(得分:2)

您正在访问的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