运行 在 C# 中动态编码

Running code dynamically in C#

我正在用 C# 开发游戏。

我有一个可能发生的事件列表。例如

List<Event> _events = new List<Event>(); _events.Add(new Event("A goblin approaches", 2)); _events.Add(new Event("A gang of thieves approaches", 3)); _events.Add(new Event("Some money has been stolen", 3)); _events.Add(new Event("Three goblins approach", 4)); _events.Add(new Event("A guard dies of unknown causes",4));

事件构造函数中的字符串是事件名称,数字是难度。

我想知道我是否也可以将代码添加到构造函数中,如果事件被调用,稍后可以 运行。我想在每个事件中使用不同的代码。

类似于

_events.Add(new Event("Some money has been stolen", 3, "Supply.Gold = Supply.Gold -50")); _events[2].runcode

我希望这是有道理的,谢谢

通过这种方法,您可以通过简单的实现来创建事件。以及具有大量代码的困难事件(通过扩展 Event class)。

public class EventContext
{
    public int Gold { get; set; }
}

public interface IEvent
{
    void Do(EventContext context);
}

public abstract class Event : IEvent
{
    protected Event(string title, int difficulty)
    {
        Title = title;
        Difficulty = difficulty;
    }

    public string Title { get; private set; }
    public int Difficulty { get; private set; }


    public abstract void Do(EventContext context);
}

public class SimpleEvent : Event
{
    private readonly Action<EventContext> _callback;

    public SimpleEvent(string title, int difficulty, Action<EventContext> callback)
        : base(title, difficulty)
    {
        _callback = callback;
    }

    public override void Do(EventContext context)
    {
        _callback(context);
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
        var gameContext = new EventContext {Gold = 100};
        var events = new List<IEvent>();
        events.Add(new SimpleEvent("Some money has been stolen", 3, context => context.Gold -= 10));

        events.First().Do(gameContext);
    }
}

但我相信将事件类型和事件处理程序分开会更好。