运行 在 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);
}
}
但我相信将事件类型和事件处理程序分开会更好。
我正在用 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);
}
}
但我相信将事件类型和事件处理程序分开会更好。