使用程序集名称和类的类型动态创建类对象

时间:2015-08-18 11:59:20

标签: c# asp.net .net reflection

我有一个控制台应用程序,我在其中声明了一个在命名空间下定义的类。我想在运行时使用assemblyname和class name创建该类的实例。我尝试了下面的代码

var objAssembly = Assembly.Load(assemblyName);
var objType = objAssembly.GetType(className);
var obj = Activator.CreateInstance(objType);

但它不起作用。以下是班级结构

namespace ReportService.ReportWriters
{
    class ExcelWriter : IReportWriter
    {
    }
}

我传递了程序集名称= ExcelWriter          class name = ReportService.ReportWriters

2 个答案:

答案 0 :(得分:0)

也许tou应该获取所有类型并找到ExcelWriter类并初始化它:

var objAssembly = Assembly.Load(assemblyName);
var objType = objAssembly.GetTypes().First(x => x.Name == "ExcelWriter");
var obj = Activator.CreateInstance(objType);

或使用Assembly.CreateInstance()方法:

var namespaceName = "ReportService.ReportWriters";
var objAssembly = Assembly.Load(assemblyName);
var obj = objAssembly.CreateInstance(objAssembly.GetName().Name.Replace(" ","_") + "." + namespaceName + "." + "ExcelWriter");

注意:如果assemblyName包含空格,编译器会将空格转换为_个字符。

注意:using System.Linq;添加到使用中。

答案 1 :(得分:0)

是的,因为您的类不包含任何公共或内部默认构造函数。

创建公共默认构造函数,然后尝试,它应该正常工作。

查看这篇文章 -

https://msdn.microsoft.com/en-us/library/wccyzw83(v=vs.110).aspx