c# - Activator 未能创建对象实例,抛出 MissingMethodException
问题描述
一些代码:
BinaryReader reader;
//...
JournalEntry.Instantiate((JournalEntry.JournalEntryType)reader.ReadByte(), reader)
日记条目:
public enum JournalEntryType {
Invalid,
Tip,
Death,
Level,
Friend
}
private readonly static Dictionary<JournalEntryType, Type> instantiationBindings = new Dictionary<JournalEntryType, Type>() {
{JournalEntryType.Invalid, typeof(JournalEntryOther)},
{JournalEntryType.Tip, typeof(JournalEntryTip)},
{JournalEntryType.Death, typeof(JournalEntryOther)},
{JournalEntryType.Level, typeof(JournalEntryOther)},
{JournalEntryType.Friend, typeof(JournalEntryOther)}
};
internal JournalEntry(BinaryReader reader) {
Read(reader);
}
internal static JournalEntry Instantiate(JournalEntryType type, BinaryReader reader) {
return (JournalEntry)Activator.CreateInstance(instantiationBindings[type], reader);;
}
日记条目提示:
internal JournalEntryTip(BinaryReader reader) {
Read(reader);
}
最顶部的代码使用值 1 的字节调用,映射到JournalEntryType.Tip
.
当我尝试运行此代码时,它会抛出System.MissingMethodException: 'Constructor on type 'JournalEntryTip' not found.'
这是为什么?构造函数存在并且应该使用正确的参数调用。
解决方案
因为构造函数是内部的,所以你需要跳过几圈才能调用它。因此,如果可以的话,您要么将其公开,要么另一种方法是调用构造函数,如下所示:
// First get the relevant constructor
var constructor = instantiationBindings[type]
.GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance, //Allow for internal ctors
null,
new[] { typeof(BinaryReader) }, // And the ctor takes a BinaryReader
null);
// Invoke the constructor
return (JournalEntry)constructor.Invoke(new[] { reader});
推荐阅读
- java - 尝试从枚举类创建字符串的 ArrayList
- ruby-on-rails - 使用 Apache、Puma、Ubuntu 设置 Rails SSL
- javascript - 如何从数组位置内的几个 json 对象访问数据
- flutter - 我使用 image_picker 录制视频,但我想限制视频的时间
- cryptography - 什么是随机预言机?
- c++ - cmake:如何迭代目录中的所有源文件并将每个源文件构建成可执行文件?
- nuxt.js - 环境变量有时不更新,有时不准确
- javascript - $.ajax() 的成功函数传递了什么?
- r - 将 R 代码链接到 azure
- javascript - React Native 可以用来构建 Progressive Web App