gpt4 book ai didi

c# - 基类中的反射是一个糟糕的设计理念吗?

转载 作者:行者123 更新时间:2023-11-30 21:24:44 25 4
gpt4 key购买 nike

一般来说,基类中的反射可以达到一些好的和有用的目的,但我有一个案例,我进退两难...使用反射,或者公开工厂类时从语义上讲真的应该是私有(private)的(即不只是任何人都应该能够使用它们)。我想这里有一些代码:

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;
}
}
}
}

现在,这段代码对我有用,但这是一个可怕的拼凑和/或一个非常糟糕的主意吗?另一种选择是将工厂的类型作为类型参数传递,但随后由于可见性限制,工厂类必须是公共(public)的,这意味着任何人都可以调用它来创建不应该创建的实例。

最佳答案

在处理泛型时,您经常不得不使用反射。在这方面,我认为你很好。

也就是说,我在这里看到了两种形式的代码异味。然而,它们可能是由于代码清理造成的,所以我只对它们进行评论:

首先,您的静态属性属于通用项。我 99.999% 确定这甚至无法编译。如果是这样,那就是错误的形式。

其次,您似乎为每次调用 Bar 返回一个新实例。这也被认为是 setter/getter 的不良形式。相反,我会使用一个名为 CreateBar() 或类似方法的方法。

关于c# - 基类中的反射是一个糟糕的设计理念吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1061340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com