Você pode usar "onde" exigir um atributo em C#?
-
03-07-2019 - |
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]
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ênciawhere T : struct
- T deve ser um tipo de valor não nulowhere T : SomeClass
- T deve ser um pouco ou derivar delewhere T : ISomeInterface
- T deve ser o ISOMEINTERFACE ou implementá -lowhere 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.