通用参数在 .NET 8 AOT 中没有匹配的注释

问题描述 投票:0回答:1

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

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:“此”参数不满足 调用中的“DynamicallyAccessedMemberTypes.PublicFields” 'System.Type.GetFields(BindingFlags)'。通用参数“T” “path o\helper\GetFields()”没有匹配的注释。 源值必须至少声明与那些相同的要求 在其分配到的目标位置上声明。

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

c# .net reflection constants .net-8.0
1个回答
0
投票

DynamicallyAccessedMembersAttribute
标记通用参数:

public static ReadOnlyCollection<T> GetFields<
    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)]
    T>()
    where T : class
{
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.