2009-07-15 5 views
3

Possible en double:
Why XML-Serializable class need a parameterless constructorPrevent appeler les constructeurs publics, sauf pour sérialiseur XML

Est-ce que quelqu'un sait s'il est possible d'empêcher l'appel d'un constructeur public de l'extérieur d'une gamme d'assemblages?

Ce que je fais est de venir avec une bibliothèque de classes qui a des classes XML sérialisables. Ces classes n'ont aucun sens si elles sont construites sans définir diverses propriétés, donc je veux empêcher cet état.

Je me demande s'il existe un moyen d'empêcher quiconque d'appeler mon constructeur public et de le conserver uniquement pour la sérialisation?

+0

Suppression de tag d'accessibilité et non valides pour cette question. –

+1

Pourquoi voulez-vous garder un constructeur public, quand vous voulez l'empêcher d'être appelé? –

+0

Est-il nécessaire que les constructeurs soient publics, ou pourriez-vous les rendre internes? –

Répondre

1

Généralement, je créerais un constructeur public avec des paramètres qui rendraient l'objet valide et créeraient un constructeur public sans paramètre avec des valeurs par défaut valides.

public foo() { 
    this.bar = -1; 
} 

public foo(int bar) { 
    this.bar = bar; 
} 

constructeur privé/interne peut être utilisé en fonction de votre situation, et vous pouvez créer un modèle d'usine qui traite de la création d'objets pour le code externe.

+0

+1 juste parce que je suis d'accord que normalement vous devriez initialiser les valeurs sensibles, mais dans cette situation, les valeurs sont d'autres classes, qui doivent être correctes. – Ian

0

Pour obtenir ce que vous demandez, vous devez probablement rendre le constructeur privé, puis utiliser une méthode getInstance pour renvoyer l'objet si l'assembly correct appelle getInstance. Vous pouvez effectuer une vérification dans la méthode getInstance si vous passez l'objet ou l'assembly qui a appelé la fonction comme l'un de ses paramètres.

0

Je ne sais pas si cela fonctionnerait dans votre cas, mais vous pouvez vérifier l'assemblage d'appel:

if (Assembly.GetCallingAssembly().GetName().Name == "Forbidden.Assembly") 
{ 
    throw new Exception(...); 
} 
Questions connexes