一般来说,基类中的反射可以放在一些好的和有用的目的上,但我有一个例子,在岩石和硬地之间......使用反射,或者当公共工厂类实际上暴露时应该是私人语义上的(即不是任何人都应该能够使用它们)。我想一些代码是为了在这里:现在在基础类中反射糟糕的设计理念吗?
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类必须是公共的,这意味着任何人都可以调用它来创建实例。
如果你说这是什么试图完成这将有助于。而且,顺便说一句,除了之后检查之外,您可以通过在锁定之前检查null来帮助自己。 – 2009-06-30 01:31:07
这将暗示我想要了解的内容,但请查看“第三版”并告诉我您的想法:http://www.yoda.arachsys.com/csharp/singleton.html – 2009-06-30 01:33:20
编辑,以包括我的实际班 – 2009-06-30 01:34:54