.net 你能像扩展方法一样扩展记录类型吗?

6tqwzwtp  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(214)

假设我所有的模型/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);

我可以想出一百万个理由来说明这可能是个坏主意,但我很好奇这是否可能?如果可能的话,有没有其他或更好的方法来修改这些类型?

gjmwrych

gjmwrych1#

根据documentation
不存在要求类型为记录的泛型约束。记录满足类或结构约束。若要对记录类型的特定层次结构进行约束,请将约束作为基类放在基记录上。
因此,您可以定义一个抽象基本实体:

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);
}

相关问题