Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何防止对象在定义的';工厂级';?_.net - Fatal编程技术网

.net 如何防止对象在定义的';工厂级';?

.net 如何防止对象在定义的';工厂级';?,.net,.net,简而言之,我想防止对象在对象工厂类中指定的静态方法之外的任何地方实例化 这可能吗?如果工厂和类位于同一程序集中,则可以将构造函数标记为内部。这将使程序集之外的任何类都不能调用构造函数(无反射)。处于同一程序集中的工厂将构造函数视为公共的,因此可以访问它们 或者,您可以将构造函数设置为私有,并在工厂内使用反射来实例化对象。您在使用反射时受到了一些影响,但这没有程序集限制,并且还可以防止同一程序集中的其他类使用工厂以外的任何东西。您需要多少保护 在大多数情况下,只需在构造函数上标记一条消息“use

简而言之,我想防止对象在对象工厂类中指定的静态方法之外的任何地方实例化


这可能吗?

如果工厂和类位于同一程序集中,则可以将构造函数标记为内部。这将使程序集之外的任何类都不能调用构造函数(无反射)。处于同一程序集中的工厂将构造函数视为公共的,因此可以访问它们


或者,您可以将构造函数设置为私有,并在工厂内使用反射来实例化对象。您在使用反射时受到了一些影响,但这没有程序集限制,并且还可以防止同一程序集中的其他类使用工厂以外的任何东西。

您需要多少保护

在大多数情况下,只需在构造函数上标记一条消息“use factory!”即可。(如果不起作用,请添加“如果不使用工厂,您将被解雇:-”)

在工厂里,你把警告关掉

我将一些示例代码与反射结合起来,用于使用私有构造函数实例化对象:

    Private Shared Function CreateObject(Of t)() As t

    Try
        Dim ci As ConstructorInfo = GetType(Class1).GetConstructor(CType(BindingFlags.Instance + BindingFlags.NonPublic, _
                      BindingFlags), Nothing, Type.EmptyTypes, Nothing)

        Dim x As t = CType(ci.Invoke(Nothing), t)

        Return x

    Catch ex As NullReferenceException
        Throw New MissingMethodException("No private constructor found")

    Catch ex As Exception
        Throw
    End Try

End Function

谢谢,我正在考虑反射,但希望我不必走这条路。我用一些示例代码为添加了一个答案。