我有一个帮助器方法,它返回一个类型的公共静态只读字段列表:

public static ReadOnlyCollection<T> GetFields<T>()
    where T : class
{
    return typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static)
        .Where(x => x.IsInitOnly && x.FieldType == typeof(T))
        .Select(x => (T)x.GetValue(null))
        .ToList().AsReadOnly();
}

当我将项目转换为.NET 8 AOT时,我收到以下错误:

错误IL2090:‘This’参数不满足 调用中的"DynamicallyAccessedMemberTypes.PublicFields" "System.Type.GetFields(BindingFlgs)".的泛型参数‘T’ ‘Path\to\Helper\GetFields()’没有匹配的批注. 源值必须至少声明与以下内容相同的要求 在它被分配到的目标位置上声明.

如何修复此错误?单元测试调用helper方法只是为了确保特定类中的常量字段是唯一的,并遵循某些语法约定.

推荐答案

将通用参数标记为DynamicallyAccessedMembersAttribute(将相应的值传递给memberTypes参数):

public static ReadOnlyCollection<T> GetFields<
    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
    T>()
    where T : class
{
    // ...
}

Csharp相关问答推荐

应用程序启动时出现错误:操作无法同时使用表单和SON主体参数

如何使嵌套for-loop更高效?

哪个nuget包含SecurityStampValidatorOptions

C#中使用BouncyCastle计算CMac

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

dotnet集合中内部数组的局部变量副本的用途是什么?'

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

如何在NodaTime中为Instant添加一年?

什么时候接受(等待)信号灯?尽可能的本地化?

如何在C#中转换泛型包装类内部的派生类

.NET并发词典交换值

.NET 6:如何防止系统生成的日志(log)?

未在Windows上运行的Maui项目

在';、';附近有错误的语法.必须声明标量变量";@Checkin";.';

多个选项卡上的MudForm验证

C#命名管道-编码错误?

我应该为C#12中的主构造函数参数创建私有属性吗?

Azure函数正在返回值列表,但该列表在Chrome中显示为空

如何将 colored颜色 转换为KnownColor名称?

Excel将';@';添加到具有范围的公式中