在 C# 中,接口中定义的属性是否适用于实现类?

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# 属性的行为是否发生了变化,还是我遗漏了什么?

Cam*_*vik 6

这些属性通过反射进行查询,并且可以以开发人员想要的任何方式访问。为了证明在您的示例代码中这是如何工作的,我查看了NewtonSoft.Json 源代码以了解它如何加载此值。

它获取JsonProperty属性的方式是在 a 上调​​用以下内容MemberInfo

JsonTypeReflector.GetAttribute<JsonPropertyAttribute>(member)
Run Code Online (Sandbox Code Playgroud)

可以在此处查看此问题时此方法的来源

正如您在第364-376行所看到的,它遍历MemberInfo的接口,然后如果无法从正在使用的类加载 JsonProperty,则尝试从接口获取属性。