当你的才华不能撑起你的野心时,就是你该选择学习的时候了!

C# Activator.CreateInstance

Activator 类

  包含用于在本地创建对象类型的方法。 无法继承此类。

  简单说 Activator.CreateInstance :使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。

  使用Activator.CreateInstance 的实际作用是什么呢?

  是因为 想创建一个方法 方法中传入一个类的名称 然后就能返回一个这个类的实例 ,这样的做法让程序有更高的拓展性

//IObjcet.cs
namespace Net.BLL.ActivatorCreateInstance
{
    public interface IObjcet
    {
        string printName();
    }
}
//ClassExam.cs
namespace Net.BLL.ActivatorCreateInstance
{
    public class ClassExam : IObjcet
    {
        private string name = "default name";
        public ClassExam()
        {

        }

        public ClassExam(string name)
        {
            this.name = name;
        }

        public string printName()
        {
            var result = string.Empty;

            result += "" + this.ToString() + "'s name is:";
            result += "" + this.name;

            return result;
        }
    }
}
//TestCall.cs
using System;

namespace Net.BLL.ActivatorCreateInstance
{
    public class TestCall
    {
        /*
            Activator 类

            包含用于在本地创建对象类型的方法。 无法继承此类。
            
            简单说 Activator.CreateInstance :使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。
            
            使用Activator.CreateInstance 的实际作用是什么呢?
            
            是因为 想创建一个方法 方法中传入一个类的名称 然后就能返回一个这个类的实例 ,这样的做法让程序有更高的拓展性,

         */

        public void Call()
        {

            //用传递参数来得到一个类的实例

            string itemType = "ClassExam";
            string assembleyName = this.GetType().Assembly.GetName().Name;//Net.BLL
            string nameSpace = this.GetType().Namespace;

            //用Activator .CreateInstance创建函数实例,默认的不带参数的构造函数
            IObjcet obj = (IObjcet)Activator.CreateInstance(Type.GetType($"{nameSpace}.{itemType},{assembleyName}"), null);
            //System.Type .GetType  命名空间.类名,程序集
            //Net.BLL.ActivatorCreateInstance.ClassExam
            var res01 = obj.printName();

            //调用ClassExam类的另一个带参数构造函数
            IObjcet obj2 = (IObjcet)System.Activator.CreateInstance(Type.GetType($"{nameSpace}.{itemType},{assembleyName}"), new string[] { "seted new name" });
            var res02 = obj2.printName();
        }
    }
}
//UnitTest1.cs

        [TestMethod]
        public void Test()
        {
            TestCall tc = new TestCall();
            tc.Call();
        }

 另一个示例,当前类操作

namespace BLL.FraudScore.Tests
{
    [TestClass()]
    public class BpFraudScoreTests
    {
        long queryRecordId { get; set; }
        PersonalCreditReport personalCreditReport { get; set; }
        QueryParameters parameters { get; set; }

        [TestInitialize]
        public void Initialize()
        {
            queryRecordId = 88888;
            parameters = new QueryParameters()
            {
                ApplicantName = "张某某",
                ApplicationNumber = "111111111111",
                IdentifyNumber = "11010819931010444X",
                IdentifyType = 1000115
            };

        }

        [TestMethod()]
        public void Test()
        {
            string itemType = "BpFraudScoreTests";
            string assembleyName = this.GetType().Assembly.GetName().Name;//UnitTest
            string nameSpace = this.GetType().Namespace;//BLL.FraudScore.Tests
            var temp01 = Type.GetType($"{nameSpace}.{itemType},{assembleyName}");//{Name = "BpFraudScoreTests" FullName = "BLL.FraudScore.Tests.BpFraudScoreTests"}
            BpFraudScoreTests temp02 = (BpFraudScoreTests)Activator.CreateInstance(temp01, null);

            temp02.Initialize();//初始化方法

            var t01 = temp02.queryRecordId;//任意变量
            var t02 = temp02.parameters;//任意变量
            var t03 = temp02.personalCreditReport;//任意变量

        }
    }

}

 

posted @ 2020-10-14 17:02  hofmann  阅读(1458)  评论(0编辑  收藏  举报