我试图使用Activator.CreateInstance(assemblyName, typeName)
创建一个类,但我得到错误
类型为"System"的未处理异常。
mscorlib.dll附加信息:无法从程序集'AssessmentDeepCompare, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'加载类型'Question' .
在这个例子中(它产生了上面的错误),我试图实例化从IAssessmentObject
继承的Question
,并在同一个程序集中。
public IAssessmentObject getInstance(string typeName) {
string assemblyName = Assembly.GetAssembly(typeof (IAssessmentObject)).ToString();
return (IAssessmentObject)Activator.CreateInstance(assemblyName, typeName);
}
当您只有类型名称而没有名称空间或程序集时,实例化对象的正确方法是什么?
听起来您确实有程序集-只是没有名称空间限定的类型名称。
您可以获取程序集中的所有类型,并从中获取类型:
var type = typeof(IAssessmentObject).Assembly
.GetTypes()
.Single(t => t.Name == "Question");
var instance = (IAssessmentObject) Activator.CreateInstance(type);
如果您有程序集名称和类型名称,以及它们所在的文件夹,则可以执行此操作。我构建它是为了根据配置文件中的选择返回一个日志记录类。
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;
如果你没有程序集名称,我不确定如何通过反射创建它。