一般的なベースクラスのリフレクションには、いくつかの便利で便利な方法がありますが、ここではロックとハードな場所の間にあるケースがあります。リフレクションを使用するか、意味的に非公開でなければなりません(つまり、誰もそれらを使用できるはずはありません)。私はいくつかのコードは、ここでの順序であると仮定しますベースクラスのリフレクションは悪い設計アイデアですか?
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;
}
}
}
}
さて、このコードは私のために動作しますが、それは恐ろしいその場しのぎおよび/または本当に悪い考えですか?もう1つのオプションは、型パラメータとしてFactoryの型を渡していますが、Visiblityの制限により、Factoryクラスはpublicでなければなりません。
になります。そして、あなたは、あなたがロックする前にヌルをチェックして、後でチェックすることに役立つかもしれません。 –
これは私が得ようとしていることを示唆しますが、ここで "第3版"を見て、あなたの考えを教えてください:http://www.yoda.arachsys.com/csharp/singleton.html –
私の実際のクラスを含むように編集 –