GetAttributes() 不返回所有属性

GetAttributes() Not Returning All Attributes

我正在尝试编写一个测试来检查我是否可以使用 [JsonConverter(typeof(JsonEnumConverter))] 属性反序列化我的所有枚举,

所以我得到了这个(进行中的)测试生成器代码:

private class TestDataGenerator: IEnumerable<object[]>
{

    public IEnumerator<object[]> GetEnumerator()
    {
        var allEnums = typeof(RecordType).Assembly.GetTypes().Where(t => t.IsEnum);
        var testEnums = allEnums.Where(e => e.GetCustomAttributes().Any(a => a is JsonConverter));
        var enumMemberInfo = testEnums.SelectMany(e => e.GetMembers(BindingFlags.Static | BindingFlags.Public));
        IEnumerable<object[]> enumsWithNames = enumMemberInfo.Select(e =>
                                                                     {
                                                                         Enum.TryParse(e.Name, out RecordType res);
                                                                         return new object[]
                                                                                {
                                                                                    res,
                                                                                    ((JsonPropertyNameAttribute)e.GetCustomAttributes().First(a => a is JsonPropertyNameAttribute)).Name
                                                                                };
                                                                     });
        return enumsWithNames.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

如果我直接用 typeof(RecordObject) 废弃 testEnums.SelectMany 和 运行,这有效。

所以跳到调试器上,问题似乎是 testEnums 的计算结果为空。如果我再查看 allEnums[0].GetCustomAttributes(),则 [JsonConverter(T)] 无处可见。

这是我的枚举:

[JsonConverter(typeof(JsonStringEnumConverter))] 
public enum RecordType
{
        [JsonPropertyName("country")]
        Country = 1,

        [JsonPropertyName("destinationOrbit")]
        DestinationOrbit = 2,

        // etc
}

为什么我的枚举中显然不存在此属性以及如何在 运行 时获取此信息有什么想法吗?

您必须按 JsonConverterAttribute 而不是 JsonConverter

进行筛选
var testEnums = allEnums.Where(e => e.GetCustomAttributes().Any(a => 
            a is JsonConverterAttribute));

Visual Studio 只会在 class 上方显示 JsonConverter 而不是 JsonConverterAttribute,但如果将光标悬停在类型上,您将看到全名。

JsonConverter 是另一种类型。