【问题标题】:CreateInstance from Type name and Assembly name从类型名称和程序集名称创建实例
【发布时间】:2014-07-08 23:21:50
【问题描述】:

我正在尝试使用 Activator.CreateInstance(assemblyName, typeName) 创建一个类,但出现错误

在 mscorlib.dll 中出现“System.TypeLoadException”类型的未处理异常

附加信息:无法从程序集“AssessmentDeepCompare, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”加载类型“Question”。

在这个例子中(产生上面的错误)我试图实例化Question,它继承自IAssessmentObject并且在同一个程序集中。

public IAssessmentObject getInstance(string typeName) {
    string assemblyName = Assembly.GetAssembly(typeof (IAssessmentObject)).ToString();
    return (IAssessmentObject)Activator.CreateInstance(assemblyName, typeName);
}

当您只有类型名称而没有命名空间或程序集时,实例化对象的正确方法是什么?

【问题讨论】:

  • 那么,如果你不告诉命名空间,Activator 应该如何知道你想要X.Foo 而不是Y.Foo
  • 我的建议是放弃 Activator 并在您的应用程序中引入一些 DI IOC 引擎。在任何情况下,您都需要了解程序集和命名空间。

标签: c# reflection


【解决方案1】:

听起来您确实拥有程序集 - 只是没有命名空间限定的类型名称。

您可以获取所有程序集中的类型,并从中获取类型:

var type = typeof(IAssessmentObject).Assembly
                                    .GetTypes()
                                    .Single(t => t.Name == "Question");
var instance = (IAssessmentObject) Activator.CreateInstance(type);

【讨论】:

  • 这正是我发布问题后不久所做的。谢谢乔恩。
【解决方案2】:

如果您有程序集名称和类型名称,以及它们所在的文件夹,则可以执行此操作。我构建它是为了根据配置文件中的选择返回一个日志记录类。

string _assemblyName = ConfigurationManager.AppSettings["MailLogger.AssemblyName"];
string _className = ConfigurationManager.AppSettings["MailLogger.ClassName"];
string _assemblyPath = ConfigurationManager.AppSettings["Reporting.Assembly.Folder"];

if (string.IsNullOrWhiteSpace(_assemblyName) || string.IsNullOrWhiteSpace(_className))
    throw new ApplicationException("Missing configuration data for the Logger.");

Assembly _loggingAssembly = Assembly.LoadFrom(System.IO.Path.Combine(_assemblyPath, _assemblyName));
ILogger _logger = _loggingAssembly.CreateInstance(_className) as ILogger;

if (_logger == null)
    throw new ApplicationException(
            string.Format("Unable to instantiate ILogger instance from {0}/{1}", _assemblyName, _className));

return _logger;

如果您没有程序集名称,我不确定如何通过反射创建它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多