我有如下界面:
public interface IError
{
[JsonPropertyName("error")]
string Error { get; }
[JsonIgnore(Condition = JsonIgnoreCondition.Always)]
int StatusCode { get; }
}
以及繼承此介面的類:
public class InvalidClient : IError
{
public string Error => "invalid_client";
public int StatusCode => (int)HttpStatusCode.Unauthorized;
}
問題是 JsonIgnore 屬性沒有被繼承。我想強制繼承這個屬性,但這可能嗎?我無法創建從 JsonIgnore 繼承的新屬性,因為它是密封類。
uj5u.com熱心網友回復:
我相信這是這個問題的重復,答案是“這是不可能的”。
有一個鏈接的博客文章說
隱式實作(如上所示)是當一個類將所討論的方法/屬性實作為該類的公共方法或屬性時。請務必注意,此方法/屬性與介面方法/屬性不同;它只是具有相同的簽名,因此可用于隱式創建介面的實作。在反射方面,兩者是不同的和不同的。由于這種差異,任何附加到介面方法或屬性的元資料都不會附加到類方法或屬性。
...
簡單的解決方法是將模型介面轉換為抽象類,以便它們可以適當地繼承屬性。如果這不可行,那么您將不得不求助于將屬性放在具體類而不是介面上。
請注意,對于上述實作,如果您轉換為抽象類,編譯器會警告您正在覆寫基礎實作,
public string Error => "invalid_client";
這將具有與屬性未“復制”到子類相同的錯誤。
在您的情況下,一種解決方法是強制轉換為介面型別。
static void Main(string[] args)
{
var c = new InvalidClient();
var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault };
var json = JsonSerializer.Serialize((IError)c, options);
Console.WriteLine(json);
}
控制臺輸出:
{"error":"invalid_client"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/515859.html
標籤:C#遗产界面属性
