我想创建一个要对绘图对象执行的操作列表。非通用代码如下所示:
private Dictionary<String, Action<Drawing, String>> actions = new Dictionary<String, Action<Drawing, String>>();
private void LoadActions()
{
actions.Add("Height", (d, s) => d.Height = Double.Parse(s));
actions.Add("Width", (d, s) => d.Width = Double.Parse(s));
}
private void ProcessDrawing(Drawing drawing, String prop, String value)
{
actions[prop](drawing, value);
}
我遇到的问题是 Drawing 类是通用类 (Drawing<T>
),因此我无法定义如下所示的操作,因为未定义 T:
Dictionary<String, Action<Drawing<T>, String>> actions = new Dictionary<String, Action<Drawing<T>, String>>();
没有缓存的代码看起来像这样:
private void ProcessDrawing<T>(Drawing<T> drawing, String prop, String value)
{
var actions = new Dictionary<String, Action<Drawing<T>, String>>();
actions.Add("Height", (d, s) => d.Height = Double.Parse(s));
actions.Add("Width", (d, s) => d.Width = Double.Parse(s));
actions[prop](drawing, value);
}
那么我怎样才能缓存一堆接受通用类型参数的 Action 呢?
谢谢,
最佳答案
所有Actions的基类都是MulticastDelegate
.你必须将你的字典定义为 Dictionary<String,MulticastDelegate>
并在从字典中检索到您的操作后使用适当的转换。
编辑:
测试表明lambda表达式显然不能直接赋值给MulticastDelegate
类型的变量.这是因为 lambda 表达式参数的类型是根据分配给它的变量(或方法参数)的类型推断出来的。因此,首先将其分配给一个具有 Action<>
权限的变量。类型。然后将其分配给 MulticastDelegate
.
在示例中,我显示了两个版本(通过方法参数和变量):
public static void CallTestDelegate()
{
TestDelegate((d, s) => d.Height = Single.Parse(s));
}
public static void TestDelegate(Action<RectangleF, string> action)
{
Dictionary<String, MulticastDelegate> dict = new Dictionary<string, MulticastDelegate>();
dict.Add("a1", action);
Action<RectangleF, string> action2 = (d, s) => d.Width = Single.Parse(s);
dict.Add("a2", action2);
var a1 = (Action<RectangleF, string>)dict["a1"];
a1(new RectangleF(), "15");
}
关于用于缓存接受通用参数的操作的 C# 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437422/