Pregunta

Quiero crear una clase genérica que solo acepte clases serializables, ¿se puede hacer con la restricción de dónde?

El concepto que estoy buscando es este:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]
¿Fue útil?

Solución

No, me temo que no. Las únicas cosas que puedes hacer con restricciones son:

  • donde T: class - T debe ser un tipo de referencia
  • donde T: struct - T debe ser un tipo de valor no anulable
  • donde T: SomeClass - T debe ser SomeClass o derivarse de ella
  • donde T: ISomeInterface : T debe ser ISomeInterface o implementarlo
  • donde T: new () : T debe tener un constructor público sin parámetros

Varias combinaciones son factibles, pero no todas. Nada acerca de los atributos.

Otros consejos

Lo que sé; no puedes hacer esto. ¿Has pensado en agregar un método de 'Inicializar' o algo similar?

public void Initialize<T>(T obj)
{
     object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
     if(attributes == null || attributes.Length == 0)
          throw new InvalidOperationException("The provided object is not serializable");
}

No he probado este código, pero espero que entiendas mi punto.

No tengo miedo. Lo mejor que puedes hacer es realizar una verificación en tiempo de ejecución en Type.IsSerializable .

Si está buscando alguna clase que sea serializable, creo que no tiene suerte. Si está buscando objetos que ha creado, puede crear una clase base que se pueda serializar y que derive de ella todas las clases que desea apoyar.

Sé que esto es antiguo, pero estoy usando un constructor estático para verificarlo. Es posterior, pero le permite lanzar un error en tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top