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
是另一种类型。
我正在尝试编写一个测试来检查我是否可以使用 [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
是另一种类型。