为什么某些属性/字段在调试器中可见,但不能从代码访问?(Why some properties/fi

2019-10-29 07:19发布

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

也似乎像有没有所谓的“属性”属性/字段

ModelMetadata类

错误:

“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);
        }
    }
}

Answer 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


文章来源: Why some properties/fields are being visible in debugger, but not accessible from the code?