Vamos a asumir que tengo varios record
-tipos con una interfaz común, de la siguiente manera:
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; }
}
Mi objetivo es escribir una función para actualizar la Etiqueta de registro de la propiedad a través de clonation.
Ahora, si el tipo se sabe, yo podría escribir algo como esto:
private Rec2 Update(Rec2 rec, string tag)
{
return rec with { Tag = tag };
}
Sin embargo, me gustaría evitar a escribir un montón de sobrecargas, así que me pregunto si hay un modo más genérico para lograr eso. Por ejemplo, yo estaría tentado de escribir como:
private TRec Update<TRec>(TRec rec, string tag) where TRec : IFoo
{
return rec with { Tag = tag };
}
pero eso no va a compilar, porque TRec
podría ser cualquier cosa (class
, struct
, etc), no sólo un record
donde puedo usar el with
declaración. Por el camino, no hay un record
-restricción de que yo pueda aplicar.
Así que, ¿hay alguna solución? es algo que esperan ser resueltos en el futuro?
Como una pregunta extra (sólo para el bien de la curiosidad), ¿por qué un record
-traducido de la clase no está marcado con una interfaz especial, con el fin de hacer el with
instrucción de trabajo contra?