你可以扩展记录类型类似于扩展方法吗?

huangapple go评论54阅读模式
英文:

Can you extend the record type similar to an extension method?

问题

我明白你的请求,以下是翻译好的部分:

"Let's say as it happens to be the case, that all my models/poco's are records. It just so happens we find it useful in many cases to convert our models to JSON. So that we don't have to override the .ToString() in every model, an EntityBase record was created with the following method and inherited by the rest of the models:

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

But I wondered if there were a way to modify or extend the record or class type almost similar to an extension method.

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

I can think of a million reasons it might be a bad idea, but I am curious if it's possible? Is there another or better way to modify these types if it's possible?"

英文:

Lets say as it happens to be the case, that all my models/poco's are records. It just so happens we find it useful in many cases to convert our models to json. So that we don't have to override the .ToString() in every model an entitybase record was created with the following method and inherited by the rest of the models:

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

But I wondered if there were a way to modify or extend the record or class type almost similar to an extension method.

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

I can think of a million reasons it might be a bad idea but I am curious if it possible? Is there another or better way to modify these types if its possible?

答案1

得分: 1

根据文档

没有强制要求类型必须是记录类型的通用约束。记录类型满足类或结构的约束。要对记录类型的特定层次结构添加约束,可以像对基类一样将约束放在基记录上。

因此,您可以定义一个抽象基本实体:

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);
}
英文:

Per the documentation:

> There's no generic constraint that requires a type to be a record. Records satisfy either the class or struct constraint. To make a constraint on a specific hierarchy of record types, put the constraint on the base record as you would a base class.

So you could define an abstract base entity:

public abstract record BaseEntity();

Derive all your records from it:

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

Then define your extension method this way:

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

But of course if you're going to do that, you may as well put it in BaseEntity.

public abstract record BaseEntity()
{
    public override string ToString() =&gt; System.Text.Json.JsonSerializer.Serialize(this);
}

huangapple
  • 本文由 发表于 2023年3月7日 12:07:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/75657959.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定