【C# 反射】使用 Activator 类 -激活器

创建的实例:

           //需要添加对Education.dll的引用才能正确执行
            object CreateInstanceKind1 = Activator.CreateInstance("Education", "People.Person");

            //不需要添加引用,因为已经传入路径参数,它默认在当前程序集的目录下查找
            object CreateInstanceKind2 = Activator.CreateInstanceFrom("Education.dll", "People.Person");
    
            //需要添加引用,并且引入命名空间
            Type type = typeof(Person);
            object CreateInstanceKind3 = Activator.CreateInstance(type);

 

这在工厂模式中是非常有用的

这样,可以使程序有更高的扩展性,例如,,下面的例子

如果现在有一个类,专门用来计算交通工具的速度,不同的交通工具计算方法是不一样的,但是到底有那些交通工具是未知的或者是可变的,这种情况下,我们可能觉得要在添加交通工具的时候,需要修改用来计算速度的那个类,

但如果用Activator .CreateInstance创建实例,通过接口技术,则只要向程序集添加一个交通工具类,而不需要修改任何其它代码..实现了高扩展性.,

创建泛型的实例:

// 先创建开放泛型
Type openType = typeof(List<>);
// 再创建具象泛型
Type target = openType.MakeGenericType(new[] { typeof(string) });
// 最后创建泛型实例
List<string> result = (List<string>)Activator.CreateInstance(target);

 

System.Activator

System.Activator类中提供了三组静态方法来创建类型的实例,每组方法均提供多个重载,适用不同的场景。个别重载方法返回ObjectHandle对象,需要unwrap后才能获取对象实例。

CreateInstance :使用最符合指定参数的构造函数创建指定类型的实例。

CreateInstanceFrom :使用指定的程序集文件和与指定参数匹配程度最高的构造函数来创建指定名称的类型的实例。

 

以下实例代码演示了如何使用上述方法创建对象实例:

public class Employee
{
    public String Name { get; set; }
    public Employee(String name)
    {
        Name = name;
    }

    public Employee ()
    {
    }

    public void Say(String greeting)
    {
        Console.WriteLine(String.Format("Employee {0} say: {1} ", Name, greeting));
    }
}
// 使用无参构造函数
var employee = (Employee)Activator.CreateInstance(typeof(Employee));
employee.Say("CreateInstance with default ctor");

// 使用有参构造函数
employee=(Employee)Activator.CreateInstance(typeof(Employee), new object[] { "David" });
employee.Say("CreateInstance with ctor with args");
            
string assembly ="Test, Version=1.0.4562.31232, Culture=neutral, PublicKeyToken=null";
string type="Test.Tests.Employee";
var employeeHandle = Activator.CreateInstance(assembly,type);
employee = (Employee)employeeHandle.Unwrap();
employee.Say("CreateInstance and unwrap.");
            
string assemblyPath=@"E:\StudyProj\ShartDev\Test\Test\bin\Debug\Test.exe";
employeeHandle = Activator.CreateInstanceFrom(assemblyPath,type);
employee = (Employee)employeeHandle.Unwrap();
employee.Say("CreateInstanceFrom and unwrap.");

 

posted @ 2021-11-01 16:25  小林野夫  阅读(1213)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/