SHH*_*SHH 4 c# attributes interface
我从很多类似的属性在接口中定义的地方读DO NOT适用于实现类,并简单地被忽略:
然而,似乎这样的属性DO适用于实现类:
using Newtonsoft.Json;
interface TestInterface
{
[JsonProperty(PropertyName = "foo")]
string id { get; set; }
}
class Test : TestInterface
{
public string id { get; set; }
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(JsonConvert.SerializeObject(new Test()));
}
}
Console Output: {"foo": null}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,JsonProperty 属性显然被应用在实现类中(将“id”字段名称更改为“foo”以进行序列化)。
界面中 C# 属性的行为是否发生了变化,还是我遗漏了什么?
这些属性通过反射进行查询,并且可以以开发人员想要的任何方式访问。为了证明在您的示例代码中这是如何工作的,我查看了NewtonSoft.Json 源代码以了解它如何加载此值。
它获取JsonProperty属性的方式是在 a 上调用以下内容MemberInfo。
JsonTypeReflector.GetAttribute<JsonPropertyAttribute>(member)
Run Code Online (Sandbox Code Playgroud)
可以在此处查看此问题时此方法的来源
正如您在第364-376行所看到的,它遍历MemberInfo的接口,然后如果无法从正在使用的类加载 JsonProperty,则尝试从接口获取属性。