C# - 序列化为 XML 信息,关于绑定委托的函数

问题描述 投票:0回答:1

我需要能够保存委托及其连接到哪个函数的信息。像这样的东西:

在 C# 中:

public class Skill
{
    [XmlAttribute("SkillFunction")]
    public EventHandler<SkillEventArgs>? SkillFunction { get; set; }
}

public static void CriticalStrike(object? sender, SkillEventArgs? e)
{
}

因此,当我保存其

SkillFunction
设置为绑定到
CriticalStrike
的技能时,它应该像这样保存:

<Skills xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org         /2001/XMLSchema">
 <Skill SkillFunction="CriticalStrike" />

当我反序列化它时,

SkillFunction
应该订阅
CriticalStrike
.

然而,这不起作用。有什么解决办法吗?或者我唯一的选择是将函数名称保存在一个字符串中,然后在一个 switch-case 中硬编码,该 switch-case 遍历所有 100 个可能的函数名称并将它们连接到正确的函数?我想避免任何硬编码,但我不知道我将如何继续这样做。

谢谢

我尝试只序列化一个 EventHandler,它没有用。我期待它能够保存委托绑定/订阅的功能。

c# xml delegates xml-serialization eventhandler
1个回答
0
投票

我用 Reflection(和 chatGPT...)解决了它,发布解决方案以防有人偶然发现此页面寻找答案。

XML类:

    [XmlAttribute("SkillFunction")]
    public string SkillFunctionName { get; set; }

保存时:

    SkillFunctionName = nameof(Skill.CriticalStrike);

加载时:

        MethodInfo? method = this.GetType().GetMethod(SkillFunctionName);
        if (method != null)
        {
            EventHandler<SkillEventArgs> skillFunctionDelegate = (EventHandler<SkillEventArgs>)Delegate.CreateDelegate(typeof(EventHandler<SkillEventArgs>), this, method);
            skillBook.Actor.DealDamageEventHandler += skillFunctionDelegate;
        }
© www.soinside.com 2019 - 2024. All rights reserved.