Je možné obmedziť metóda pre záznamy len?

0

Otázka

Predpokladajme, že mám niekoľko rôznych record-typy s common interface, a to takto:

record Rec1(
    string Tag
    ) : IFoo;

record Rec2(
    int Num,
    string Tag
    ) : IFoo;

record Rec3(
    bool Flag
    ) : IFoo
{
    public string Tag { get; init; }
    public double Value { get; init; }
}

// ... others ...

interface IFoo
{
    string Tag { get; }
}

Môj cieľ je písať funkciu, ak chcete aktualizovať Značku nehnuteľnosti prostredníctvom záznam clonation.

Teraz, ak typu boli známe, mohol by som napísať niečo takéto:

    private Rec2 Update(Rec2 rec, string tag)
    {
        return rec with { Tag = tag };
    }

Avšak, chcel by som sa napísať veľa preťažením, takže som sa opýtať, či je tu viac všeobecný spôsob, ako dosiahnuť to. Napríklad, ja by som v pokušení napísať ako:

    private TRec Update<TRec>(TRec rec, string tag) where TRec : IFoo
    {
        return rec with { Tag = tag };
    }

ale, že nebudete zhromažďovať, pretože TRec môže byť čokoľvek (class, structatď.), nie len record kde môžem použiť with ziskov a strát. Mimochodom, nie je to record-obmedzenie by som mohol použiť.

Tak, existuje riešenie? je to niečo očakávať, že bude riešiť v budúcnosti?

Ako bonus otázku (len kvôli zvedavosti), prečo record-preložené triedy nie je označené ako špeciálne rozhranie, aby with výkaz práce proti?

c# constraints generics record
2021-11-20 05:42:41
2

Najlepšiu odpoveď

1

Namiesto toho, prázdnu základňu záznam, majú všetky tieto záznamy, dedia zo spoločného základu záznam, ktorý implementuje svoje rozhranie:

record R : IFoo ...

record Rec1 : R....
record Rec2 : R....

private TRec Update<TRec>(TRec rec, string tag) where TRec : R
{
    return rec with { Tag = tag };
}
2021-11-20 07:03:58

Súhlasíte s tým, vyzerá lepšie!
Mario Vernari

IMHO, nie len vyzerá lepšie, ale v skutočnosti je lepšie - nielen nepoužívate "značku", ktorá je kód vôňa, v skutočnosti budete pomocou dedičstva, tak by to malo byť použitý.
Zohar Peled
0

Vďaka iný príjem (viď link v komentári), zdá sa, že hacky riešenie:

record R();

record Rec1(
    string Tag
    ) : R, IFoo;

// ... others ...

interface IFoo
{
    string Tag { get; init; }
}

private TRec Update<TRec>(TRec rec, string tag) where TRec : R, IFoo
{
    return rec with { Tag = tag };
}

Obmedzenia je efektívny vzhľadom na R nahrávať, zatiaľ čo Tag priradenie vďaka init accessor.

Opäť, pre mňa je podobne ako hack ako skutočné riešenie. Radšej by som vidieť nejaké natívnu podporu.

2021-11-20 06:57:32

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................