Pergunta

Quero fazer uma classe genérica que aceite apenas classes serializáveis, pode ser feito com a restrição onde?

O conceito que estou procurando é o seguinte:

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

Solução

Não, receio que não. As únicas coisas que você pode fazer com as restrições são:

  • where T : class - T deve ser um tipo de referência
  • where T : struct - T deve ser um tipo de valor não nulo
  • where T : SomeClass - T deve ser um pouco ou derivar dele
  • where T : ISomeInterface - T deve ser o ISOMEINTERFACE ou implementá -lo
  • where T : new() - T deve ter um construtor público sem parâmetros

Várias combinações são viáveis, mas não todas. Nada sobre atributos.

Outras dicas

O que eu sei; você não pode fazer isso. Você tem adicionado um método 'Inicializar' ou algo semelhante?

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");
}

Não testei este código, mas espero que você entenda meu ponto.

Não tem medo. O melhor que você pode fazer é uma verificação de tempo de execução Type.isseserializable.

Se você está procurando qualquer classe que seja serializável, acho que você está sem sorte. Se você está procurando objetos que criou, pode criar uma classe base serializável e ter todas as classes que deseja apoiar derivam dela.

Eu sei que isso é antigo, mas estou usando um construtor estático para verificar. É mais tarde, mas permite que você apresente um erro em tempo de execução.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top