我有一個類層次結構來模擬受歧視的聯合。一個這樣的類是一個記錄:
private sealed record ErrorStrWithEnum<TEnum>(string Error, TEnum Enum) : Error
where TEnum : struct, Enum
然后我有一個型別的物件,Error我想提取訊息:
error switch
{
ErrorStrWithEnum<_>(var message, _) => message
}
這顯然行不通。即使類支持協方差,我也無法匹配,ErrorStrWithEnum<object>(var message, _)因為值型別不支持 cov-/contravariance。
另一種方法是引入中介型別,ErrorStrWithEnum(string Error, object Enum)但它會導致拳擊。
有沒有更優雅的選擇?
uj5u.com熱心網友回復:
您需要為訊息或介面引入帶有字串的非通用記錄并與之匹配:
private record ErrorWithStr(string Error) : Error;
private sealed record ErrorStrWithEnum<TEnum>(string Error, TEnum Enum) : ErrorWithStr(Error)
where TEnum : struct, Enum;
error switch
{
ErrorWithStr(var message) => message
}
或者
private interface IHaveError {
string Error { get; }
}
private sealed record ErrorStrWithEnum<TEnum>(string Error, TEnum Enum) : Error, IHaveError
where TEnum : struct, Enum
x switch
{
IHaveError err=> err.Error
}
uj5u.com熱心網友回復:
記錄可以實作介面,因此您可以將該字串公開為介面屬性:
private interface IHasMessage {
string Message { get; }
}
private sealed record ErrorStrWithEnum<TEnum>(string Message, TEnum Enum)
: Error, IHasMessage
where TEnum : struct, Enum
{
...
}
然后你可以匹配IHasMessage:
error switch
{
IHasMessage { Message: var message } => message
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/330736.html
上一篇:將資料從視圖傳遞到控制器時出錯
下一篇:接受2個或更多列舉型別的C#串列
