gpt4 book ai didi

c# - 临时存储一个 Delegate 以供以后调用

转载 作者:行者123 更新时间:2023-12-03 13:20:07 25 4
gpt4 key购买 nike

我想在进行异步操作时使用列表作为将操作存储到框架中。
然后稍后当框架同步时,我将循环遍历列表并执行操作。

有没有办法做到这一点,重点是:
- 没有反射/动态调用。
- 不为要调用的每个新方法创建类/结构。
- 键入安全。
- 将 Action 存储在列表中。
- 存储不同种类的方法和参数。
- 稍后执行列表。

我不想使用反射的原因是因为它是一个性能问题。它会被非常频繁地使用。
在这种情况下,它与游戏相关,但代码可以用作多面手,如果可以避免反射/DynamicInvoke,则非常适合多线程。

如果这是不可能的,那么还有其他不错的选择吗?

我在代码中做了一个例子,但它使用反射并且不是类型安全的。
基本上步骤是:
1. 使用具有多个不同参数的方法填充列表。
2.遍历列表并执行所有带有参数的方法。
3. 清除下一个周期的列表。

{
struct MyDelayedCaller
{
public Delegate TheTarget;
public object[] MyParameters;

public MyDelayedCaller(Delegate target, object[] parameters)
{
TheTarget = target;
MyParameters = parameters;
}
}

List<MyDelayedCaller> Temporary = new List<MyDelayedCaller>();
void Update()
{
//something happened and another class needs to know
//but it will have to wait for the sync so as to not cause any treading problems

Temporary.Add(new MyDelayedCaller(new DelDoSomething1(DoSomething1), new object[] { 10, false }));
Temporary.Add(new MyDelayedCaller(new DelDoSomething1(DoSomething1), new object[] { 11, true }));

Temporary.Add(new MyDelayedCaller(new DelDoSomething3(DoSomething3), new object[] { "Some text" }));
Temporary.Add(new MyDelayedCaller(new DelDoSomething2(DoSomething2), new object[] { 1, 9999, 0.4f }));
}
void Sync()
{
foreach (var item in Temporary)
{
item.TheTarget.DynamicInvoke(item.MyParameters);
}
Temporary.Clear();
}

delegate void DelDoSomething1(int index, bool alive);
void DoSomething1(int index, bool alive)
{

}
delegate void DelDoSomething2(int index, int amount, float scale);
void DoSomething2(int index, int amount, float scale)
{

}
delegate void DelDoSomething3(string text);
void DoSomething3(string text)
{

}
}

最佳答案

我希望我能理解这个问题,因为答案似乎很简单:只需存储一个 List<Action> .你可以在里面放任何你想要的东西。您可以枚举列表并调用所有内容。

您绝对可以将参数化调用添加到这样的列表中:() => DoSomething1(10, false) .参数封装在 Action 中. C# 编译器生成一个(强类型)闭包类并为您完成所有这些工作。

这不是你想要的吗?

关于c# - 临时存储一个 Delegate 以供以后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21197270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com