首页 > 解决方案 > 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.'

这是为什么?构造函数存在并且应该使用正确的参数调用。

标签: c#system.reflectionactivator

解决方案


因为构造函数是内部的,所以你需要跳过几圈才能调用它。因此,如果可以的话,您要么将其公开,要么另一种方法是调用构造函数,如下所示:

// 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});

推荐阅读