我很好奇,为什么我不能从代码中访问Attributes
,但在调试器中却完全可见?
似乎还没有一个名为“属性”的属性/字段
错误:
'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);
}
}
}
答案 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