从类型名称和程序集名称创建实例



我试图使用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;

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

相关内容

  • 没有找到相关文章

最新更新