¿Puedes usar “dónde” para requerir un atributo en c #?

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

El concepto que estoy buscando es este:

public class MyClass where T : //[is serializable/has the serializable attribute] 

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

  • where T : class – T debe ser un tipo de referencia
  • where T : struct – T debe ser un tipo de valor que no admite nulos
  • where T : SomeClass – T debe ser SomeClass o derivar de ella
  • where T : ISomeInterface – T debe ser ISomeInterface o implementarlo
  • where T : new() – T debe tener un constructor público sin parámetros

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

Lo que yo sé; no puedes hacer esto. ¿Has pensado en agregar un método de “inicialización” o algo similar?

 public void Initialize(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.

Miedo no. Lo mejor que puede hacer es verificar el tiempo de ejecución en Type.IsSerializable .

Si está buscando una clase que sea serializable, creo que no tiene suerte. Si está buscando objetos que ha creado, puede crear una clase base que sea serializable y que todas las clases que desee respaldar se deriven de ella.

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