En général, la réflexion dans une classe de base peut être utile et utile, mais j'ai ici un cas où je suis entre un rock et un endroit difficile ... Utilisez Reflection, ou exposer des classes publiques quand elles sont vraiment devrait être privé sémantiquement parlant (c'est-à-dire que tout le monde ne devrait pas être capable de les utiliser). Je suppose un code est en ordre ici:La réflexion dans une classe de base est-elle une mauvaise idée de conception?
public abstract class SingletonForm<TThis> : Form
where TThis : SingletonForm<TThis>
{
private static TThis m_singleton;
private static object m_lock = new object();
private static ISingletonFormFactory<TThis> m_factory;
protected SingletonForm() { }
public static TThis Singleton
{
get
{
lock (m_lock)
{
if (m_factory == null)
{
foreach (Type t in typeof(TThis).GetNestedTypes(BindingFlags.NonPublic))
{
foreach (Type i in t.GetInterfaces())
{
if (i == typeof(ISingletonFormFactory<TThis>))
m_factory = (ISingletonFormFactory<TThis>)Activator.CreateInstance(t);
}
}
if (m_factory == null)
throw new InvalidOperationException(string.Format(
CultureInfo.InvariantCulture,
"{0} does not implement a nested ISingletonFormFactory<{0}>.",
typeof(TThis).ToString()));
}
if (m_singleton == null || m_singleton.IsDisposed)
{
m_singleton = m_factory.GetNew();
}
return m_singleton;
}
}
}
}
Maintenant, ce code fonctionne pour moi, mais est-ce une bidouille horrible et/ou une mauvaise idée? L'autre option passe dans le type Factory en tant que paramètre de type, mais en raison des limites de visibilité, la classe Factory doit être publique, ce qui signifie que n'importe qui peut l'appeler pour créer des instances alors qu'elles ne le devraient pas.
Il serait utile si vous avez dit ce que cela voulait accomplir. Et, BTW, vous pouvez vous aider en vérifiant null avant de verrouiller en plus de vérifier par la suite. –
Cela donnera un indice sur ce que je cherche à obtenir, mais jetez un oeil ici à la "troisième version" et dites-moi ce que vous pensez: http://www.yoda.arachsys.com/csharp/singleton.html –
édité pour inclure ma classe réelle –