是否可以像扩展方法一样扩展记录类型?

问题描述 投票:0回答:1

碰巧是这样,我所有的模型/poco 都是记录。碰巧我们发现在很多情况下将我们的模型转换为 json 很有用。这样我们就不必在每个模型中覆盖 .ToString() ,使用以下方法创建实体库记录并由其余模型继承:

public record EntityBase
{
    public override string ToString()
    {
        return System.Text.Json.JsonSerializer.Serialize(this);
    }
}

但我想知道是否有一种几乎类似于扩展方法的修改或扩展记录或类类型的方法。

    // record / class are not valid types here
    public static string ToString(this record value)
        => System.Text.Json.JsonSerializer.Serialize(value);
    
    // this works but I want to constrain it to records and non generic methods do not allow constraints
    public static string ToString(this object value)
        => System.Text.Json.JsonSerializer.Serialize(value);

我能想到一百万个理由,这可能是个坏主意,但我很好奇这是否可能?如果可能的话,是否有另一种或更好的方法来修改这些类型?

c# .net record
1个回答
0
投票

根据文档

没有要求类型成为记录的通用约束。记录满足类或结构约束。要对记录类型的特定层次结构进行约束,请像对基类一样对基记录进行约束。

所以你可以定义一个抽象的基础实体:

public abstract record BaseEntity();

从中导出所有记录:

public record MyEntity(...) : BaseEntity();

然后这样定义你的扩展方法:

public static ToJson<T>(this T source) where T : BaseEntity
{
    return System.Text.Json.JsonSerializer.Serialize(source);
}

当然,如果你打算这样做,你也可以把它放在 BaseEntity 中。

public abstract record BaseEntity()
{
    public override string ToString() => System.Text.Json.JsonSerializer.Serialize(this);
}
© www.soinside.com 2019 - 2024. All rights reserved.