Mat*_*ton 7 c# generics static factory
我想控制一堆类的创建,这些类都共享一个公共接口,并且在构造中都需要一些逻辑.另外,我不希望除了类工厂之外的任何其他代码能够从这些类创建对象.
我的主要障碍是:
(1)对于能够创建类实例的泛型方法,我需要new()约束,这意味着我必须在类上有一个公共构造函数,这意味着它们可以公开创建.
(2)另一种方法是让类本身具有一个返回类实例的静态方法.但我无法从我的泛型类中调用它,因为我需要处理接口/类型,并且不能通过接口进行静态处理.
这是我目前得到的那种东西,但是它使用了new()约束,它允许公开创建我的类:
internal static class MyClassFactory
{
internal static T Create<T>(string args) where T : IMyType, new()
{
IMyType newThing = new T();
newThing.Initialise(string args);
return (T)newThing;
}
}
public interface IMyType
{
void Initialise(string args);
}
public class ThingA: IMyType
{
public void Initialise(string args)
{
// do something with args
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢:)
考虑一种反思方法。
只需将类的构造函数标记为私有,这样它们就不能以常规方式实例化,并且您的工厂将使用反射调用此私有类构造函数。
反射会对性能产生影响,但调用此构造函数并不是一个很大的反射操作。
查看这篇 MSDN 文章,了解有关如何使用反射调用私有构造函数的更多信息:
但可以用这个代码片段来总结:
typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Private, Type.EmptyTypes, Type.DefaultBinder, null).Invoke(null);
Run Code Online (Sandbox Code Playgroud)
更新
顺便说一句,我认为以任何方式影响性能和增加代码复杂性并不是一个强有力的理由,因为您不希望开发人员仅通过使用此类工厂方法来实例化类。
有时,好的开发人员指南比任何代码约束都更好。我这么说是因为,在你的情况下,我会使用 T 泛型参数和相同的泛型约束来实现该工厂方法,并且如果我的文档文件说“如果你想要 T 类型的实例,你需要使用这个工厂”有些人决定不遵守这条规则,这不是我的责任,任何问题都会用“手册说你需要使用工厂”来回答。
良好的习惯比处理人类决策的额外防御性代码更好。