gpt4 book ai didi

c# - 回调的通用存储

转载 作者:行者123 更新时间:2023-11-30 21:36:40 25 4
gpt4 key购买 nike

我需要一些商店,在那里我可以注册一些自动更新的回调。

class Store
{
readonly Dictionary<Type, Action<dynamic>> _callbacks = new Dictionary<Type, Action<dynamic>>();

public void Register<T>(Action<T> updateCallback)
{
_callbacks.Add(typeof(T), value => updateCallback(value));
}

public void Save<T>(T value)
{
_callbacks[typeof(T)](value);
}
}

class Program
{
private static string _stringField = "0";
private static int _intField = 0;

static void Main(string[] args)
{
var store = new Store();
store.Register<string>(value => _stringField = value);
store.Register<int>(value => _intField = value);
Console.WriteLine($"{_stringField}/{_intField}");
store.Save("5");
Console.WriteLine($"{_stringField}/{_intField}");
store.Save(7);
Console.WriteLine($"{_stringField}/{_intField}");
}
}

输出:

0/0 5/0 5/7

它工作正常。我就是不喜欢Action<dynamic>在词典中。首先,它看起来像一个 hack。二次它产生box Save 方法中的操作,因为 dynamic .我知道我不能只使用泛型,因为我不在静态上下文中,但我正在为这个示例寻找最佳解决方案。请在不更改 Program 的情况下告知一些代码类(class)。所以我需要注册一次,它会在每次 Save 时自动更新。方法调用。

最佳答案

如果你不喜欢dynamic ,您可以将回调存储为 Action<object> ,像这样:

class Store {
readonly Dictionary<Type, Action<object>> _callbacks = new Dictionary<Type, Action<object>>();

public void Register<T>(Action<T> updateCallback) {
// cast here
_callbacks.Add(typeof(T), value => updateCallback((T) value));
}

public void Save<T>(T value) {
_callbacks[typeof(T)](value);
}
}

关于c# - 回调的通用存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943706/

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