Activator.CreateInstance

IObject

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ActivatorLibrary
{
    public interface IObject
    {
        void PrintName();
    }
}

ClassExam

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ActivatorLibrary
{
    public class ClassExam:IObject
    {
        private string name = "default name";
        public ClassExam()
        {

        }
        public ClassExam(string name)
        {
            this.name = name;
        }
        public void PrintName()
        {
            Console.WriteLine(this.name);
        }
    }
}

Main

using ActivatorLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IObject obj1 = (IObject)Activator.CreateInstance(Type.GetType("ActivatorLibrary.ClassExam,ActivatorLibrary"));
            obj1.PrintName();
            IObject obj2 = (IObject)Activator.CreateInstance(Type.GetType("ActivatorLibrary.ClassExam,ActivatorLibrary"), new object[] { "seted new name" });
            obj2.PrintName();
            Console.ReadKey();
        }
    }
}
获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:
Type t = Type.GetType(“System.String”);
需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用GetType。
本装配件中类型可以只写类型名称,另一个例外是mscorlib.dll,这个装配件中声明的类型也可以省略装配件名称(.Net装配件编译的时候,默认都引用了mscorlib.dll,除非在编译的时候明确指定不引用它),比如:
System.String是在mscorlib.dll中声明的,上面的Type t = Type.GetType(“System.String”)是正确的
System.Data.DataTable是在System.Data.dll中声明的,那么:
Type.GetType(“System.Data.DataTable”)就只能得到空引用。
必须:
Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
posted @ 2016-04-16 18:34  wjl910  阅读(422)  评论(0)    收藏  举报