一般に、基本クラスでのリフレクションは、いくつかの有益で有用な目的に使用できますが、ここでは岩と困難な場所の間にいる場合があります... リフレクションを使用するか、パブリック ファクトリ クラスを実際に公開する必要がある場合に公開します。意味的に言えばプライベートです(つまり、誰でも使用できるべきではありません)。私はいくつかのコードがここにあると思います:
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 の型を型パラメーターとして渡すことですが、可視性の制限により、Factory クラスは public である必要があります。