Assembly.CreateInstance 方法

定义

从此程序集中查找某个类型,然后使用系统激活器创建它的实例。

重载

CreateInstance(String)

使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

CreateInstance(String, Boolean)

使用可选的区分大小写搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

CreateInstance(String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])

使用可选的区分大小写搜索并具有指定的区域性、参数和绑定及激活特性,从此程序集中查找指定的类型,并使用系统激活器创建它的实例。

CreateInstance(String)

Source:
Assembly.cs
Source:
Assembly.cs
Source:
Assembly.cs

使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

public:
 System::Object ^ CreateInstance(System::String ^ typeName);
public:
 virtual System::Object ^ CreateInstance(System::String ^ typeName);
public object? CreateInstance (string typeName);
public object CreateInstance (string typeName);
member this.CreateInstance : string -> obj
abstract member CreateInstance : string -> obj
override this.CreateInstance : string -> obj
Public Function CreateInstance (typeName As String) As Object

参数

typeName
String

要查找类型的 FullName

返回

使用无参数构造函数创建的指定类型的实例;如果未找到 typeName,则为 null。 该类型使用默认联编程序解析,而无需指定区域性或激活属性,并将 BindingFlags 设置为 PublicInstance

实现

例外

typeName 为空字符串 ("") 或以空字符开头的字符串。

- 或 -

当前程序集已加载到仅反射上下文中。

typeNamenull

未找到匹配的构造函数。

typeName 所需的从属程序集无法找到。

typeName 所需的从属程序集已找到,但无法加载。

- 或 -

当前程序集被加载到仅反射上下文中,并且 typeName 所需的从属程序集未预先加载。

typeName 需要依赖程序集,但文件不是当前加载的运行时的有效程序集。

示例

以下示例定义类 Person 并调用 CreateInstance(String) 方法来实例化它。

using System;
using System.Reflection;
using Contoso.Libraries;

namespace Contoso.Libraries
{
   public class Person
   {
      private string _name;

      public Person()
      { }

      public Person(string name)
      {
         this._name = name;
      }

      public string Name
      { get { return this._name; }
        set { this._name = value; } }

      public override string ToString()
      {
         return this._name;
      }
   }
}

public class Example
{
   public static void Main()
   {
      Assembly assem = typeof(Person).Assembly;
      Person p = (Person) assem.CreateInstance("Contoso.Libraries.Person");
      if (! (p == null)) {
         p.Name = "John";
         Console.WriteLine("Instantiated a {0} object whose value is '{1}'",
                           p.GetType().Name, p);
      }
      else {
         Console.WriteLine("Unable to instantiate a Person object.");
      }
   }
}
// The example displays the following output:
//        Instantiated a Person object whose value is 'John'
Imports System.Reflection
Imports Contoso.Libraries

Namespace Contoso.Libraries
   Public Class Person
      Private _name As String 
   
      Public Sub New()
      End Sub 
   
      Public Sub New(name As String)
         Me._name = name
      End Sub 
   
      Public Property Name As String 
         Get 
            Return Me._name
         End Get 
         Set 
            Me._name = value
         End Set 
      End Property 
   
      Public Overrides Function ToString() As String 
         Return Me._name
      End Function 
   End Class
End Namespace 

Module Example
   Public Sub Main()
      Dim assem As Assembly = GetType(Person).Assembly
      Dim p As Person = CType(assem.CreateInstance("Contoso.Libraries.Person"),
                              Person)
      If p IsNot Nothing Then
         p.Name = "John"
         Console.WriteLine("Instantiated a {0} object whose value is '{1}'",
                           p.GetType().Name, p)
      Else
         Console.WriteLine("Unable to instantiate a Person object.")
      End If   
   End Sub
End Module
' The example displays the following output:
'       Instantiated a Person object whose value is 'John'

注解

如果运行时在实例中Assembly找不到typeName,它将返回null而不是引发异常。 出现这种情况的原因可能是:

  • 尚未指定类型的完全限定名称。

  • 你已指定完全限定的类型名称,但其大小写与类型属性的 Type.FullName 大小写不匹配。 对于 与类型全名不区分大小写的比较 typeName ,请调用 CreateInstance(String, Boolean) 重载并为 参数指定 trueignoreCase

  • 类型在当前 Assembly 实例中不存在。

适用于

CreateInstance(String, Boolean)

Source:
Assembly.cs
Source:
Assembly.cs
Source:
Assembly.cs

使用可选的区分大小写搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

public:
 System::Object ^ CreateInstance(System::String ^ typeName, bool ignoreCase);
public:
 virtual System::Object ^ CreateInstance(System::String ^ typeName, bool ignoreCase);
public object? CreateInstance (string typeName, bool ignoreCase);
public object CreateInstance (string typeName, bool ignoreCase);
member this.CreateInstance : string * bool -> obj
abstract member CreateInstance : string * bool -> obj
override this.CreateInstance : string * bool -> obj
Public Function CreateInstance (typeName As String, ignoreCase As Boolean) As Object

参数

typeName
String

要查找类型的 FullName

ignoreCase
Boolean

如果为 true,则忽略类型名的大小写;否则,为 false

返回

使用无参数构造函数创建的指定类型的实例;如果未找到 typeName,则为 null。 该类型使用默认联编程序解析,而无需指定区域性或激活属性,并将 BindingFlags 设置为 PublicInstance

实现

例外

typeName 为空字符串 ("") 或以空字符开头的字符串。

- 或 -

当前程序集已加载到仅反射上下文中。

未找到匹配的构造函数。

typeNamenull

typeName 所需的从属程序集无法找到。

typeName 所需的从属程序集已找到,但无法加载。

- 或 -

当前程序集被加载到仅反射上下文中,并且 typeName 所需的从属程序集未预先加载。

typeName 需要依赖程序集,但文件不是当前加载的运行时的有效程序集。

示例

下面的示例定义了一个名为 Person 的类。 然后, CreateInstance(String) 它调用 方法来实例化它,但由于 参数的大小 typeName 写与类型属性的大小 FullName 写不匹配,因此该方法返回 null。 当该示例将同一字符串传递给 CreateInstance(String, Boolean) 重载并指定比较应不区分大小写时, Person 将找到 类,并 Person 成功实例化对象。

using System;
using System.Reflection;
using Contoso.Libraries;

namespace Contoso.Libraries
{
   public class Person
   {
      private string _name;

      public Person()
      { }

      public Person(string name)
      {
         this._name = name;
      }

      public string Name
      { get { return this._name; }
        set { this._name = value; } }

      public override string ToString()
      {
         return this._name;
      }
   }
}

public class Example
{
   public static void Main()
   {
      String fullName = "contoso.libraries.person";
      Assembly assem = typeof(Person).Assembly;
      Person p = (Person) assem.CreateInstance(fullName);
      if (! (p == null)) {
         p.Name = "John";
         Console.WriteLine("Instantiated a {0} object whose value is '{1}'",
                           p.GetType().Name, p);
      }
      else {
         Console.WriteLine("Unable to instantiate a Person object " +
                           "with Assembly.CreateInstance(String)");
         // Try case-insensitive type name comparison.
         p = (Person) assem.CreateInstance(fullName, true);
         if (! (p == null)) {
            p.Name = "John";
            Console.WriteLine("Instantiated a {0} object whose value is '{1}'",
                              p.GetType().Name, p);
         }
         else {
            Console.WriteLine("Unable to instantiate a {0} object.",
                              fullName);
         }
      }
   }
}
// The example displays the following output:
//    Unable to instantiate a Person object with Assembly.CreateInstance(String)
//    Instantiated a Person object whose value is 'John'
Imports System.Reflection
Imports Contoso.Libraries

Namespace Contoso.Libraries
   Public Class Person
      Private _name As String 
   
      Public Sub New()
      End Sub 
   
      Public Sub New(name As String)
         Me._name = name
      End Sub 
   
      Public Property Name As String 
         Get 
            Return Me._name
         End Get 
         Set 
            Me._name = value
         End Set 
      End Property 
   
      Public Overrides Function ToString() As String 
         Return Me._name
      End Function 
   End Class
End Namespace 

Module Example
   Public Sub Main()
      Dim fullName As String = "contoso.libraries.person"
      Dim assem As Assembly = GetType(Person).Assembly
      Dim p As Person = CType(assem.CreateInstance(fullName),
                              Person)
      If p IsNot Nothing Then
         p.Name = "John"
         Console.WriteLine("Instantiated a {0} object whose value is '{1}'",
                           p.GetType().Name, p)
      Else
         Console.WriteLine("Unable to instantiate a Person object" +
                           "with Assembly.CreateInstance(String)")
         ' Try case-insensitive type name comparison.
         p = CType(assem.CreateInstance(fullName, true), Person)
         If p IsNot Nothing Then 
            p.Name = "John"
            Console.WriteLine("Instantiated a {0} object whose value is '{1}'",
                              p.GetType().Name, p)
         Else 
            Console.WriteLine("Unable to instantiate a {0} object.", 
                              fullName)
         End If   
      End If   
   End Sub
End Module
' The example displays the following output:
'    Unable to instantiate a Person object with Assembly.CreateInstance(String)
'    Instantiated a Person object whose value is 'John'

注解

如果运行时在实例中Assembly找不到typeName,它将返回null而不是引发异常。 出现这种情况的原因可能是:

  • 尚未指定类型的完全限定名称。

  • 类型在当前 Assembly 实例中不存在。

适用于

CreateInstance(String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])

Source:
Assembly.cs
Source:
Assembly.cs
Source:
Assembly.cs

使用可选的区分大小写搜索并具有指定的区域性、参数和绑定及激活特性,从此程序集中查找指定的类型,并使用系统激活器创建它的实例。

public:
 virtual System::Object ^ CreateInstance(System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes);
public virtual object? CreateInstance (string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object[]? args, System.Globalization.CultureInfo? culture, object[]? activationAttributes);
public virtual object CreateInstance (string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes);
public object CreateInstance (string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes);
abstract member CreateInstance : string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] -> obj
override this.CreateInstance : string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] -> obj
Public Overridable Function CreateInstance (typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object()) As Object
Public Function CreateInstance (typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object()) As Object

参数

typeName
String

要查找类型的 FullName

ignoreCase
Boolean

如果为 true,则忽略类型名的大小写;否则,为 false

bindingAttr
BindingFlags

影响执行搜索的方式的位掩码。 此值是 BindingFlags中的位标志的组合。

binder
Binder

一个对象,它启用绑定、对自变量类型的强制、对成员的调用,以及通过反射对 MemberInfo 对象的检索。 如果 bindernull,则使用默认联编程序。

args
Object[]

包含要传递给构造函数的自变量的数组。 此自变量数组在数量、顺序和类型方面必须与要调用的构造函数的参数匹配。 如果需要无参数构造函数,则 args 必须是空数组或 null

culture
CultureInfo

用于控制类型强制的 CultureInfo 的实例。 如果这是 null,则使用当前线程的 CultureInfo。 (例如,这对于将表示 1000 的字符串转换为 Double 值来说是必需的,因为不同的区域性以不同的方式表示 1000。)

activationAttributes
Object[]

包含一个或多个可以参与激活的特性的数组。 通常,为包含单个 UrlAttribute 对象的数组,该对象指定激活远程对象所需的 URL。 此参数与客户端激活的对象相关。 客户端激活是一项传统技术,保留用于向后兼容,但不建议用于新的开发。 应改用 Windows Communication Foundation 来开发分布式应用程序。

返回

如果未找到 null,则为指定的类型实例或 typeName。 所提供的自变量用于解析类型,以及绑定用于创建实例的构造函数。

实现

例外

typeName 为空字符串 ("") 或以空字符开头的字符串。

- 或 -

当前程序集已加载到仅反射上下文中。

typeNamenull

未找到匹配的构造函数。

非空激活属性数组被传递给不是继承自 MarshalByRefObject 的类型。

typeName 所需的从属程序集无法找到。

typeName 所需的从属程序集已找到,但无法加载。

- 或 -

当前程序集被加载到仅反射上下文中,并且 typeName 所需的从属程序集未预先加载。

typeName 需要依赖程序集,但文件不是当前加载的运行时的有效程序集。

适用于