用于缓存接受通用参数的操作的 C# 模式

标签 c# design-patterns .net-3.5

我想创建一个要对绘图对象执行的操作列表。非通用代码如下所示:

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/

相关文章:

c# - Asp.net mvc 基于角色的身份验证

java - 防止 Jackson @JsonIgnore 引入重复

c# - Selenium - 查找具有标题的元素

c# - 多语言 winforms 应用程序

java - 嵌套开关还是多功能,什么才是更好的设计?

c# - 有没有办法在 .NET 3.0 项目中使用 LINQ 查询语法?

c# - 在 C#.NET 中执行 bool 逻辑运算的最有效方法是什么?

使用 iframe 的 ASP.net

c# - 有什么理由让 Timer 将 AutoReset 设置为 false,然后在其经过的事件期间重新启动自身?

c++ - 控制反转的利弊