一般来说,基类中的反射可以达到一些好的和有用的目的,但是我在这里有一个案例,我处于困境和困境之间......使用反射,或者在它们真正应该公开的时候公开工厂类从语义上讲是私有的(即,不只是任何人都应该能够使用它们)。我想这里有一些代码:
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;
}
}
}
}
现在,这段代码对我有用,但它是一个可怕的组合和/或一个非常糟糕的主意吗?另一种选择是将 Factory 的类型作为类型参数传递,但是由于可见性限制,Factory 类必须是公共的,这意味着任何人都可以调用它来创建不应该的实例。