0

我在我的项目函数中多次使用需要将泛型作为参数传递的函数。这些函数有不同的输入,但它们都需要一个 T 作为参数。

让我用一些代码解释我目前在做什么:

        switch (tableName)
        {
            case "product":
                foo<Entities.Product>(value);
                break;

            case "customer":
                foo <Entities.Customer>(value);
                break;
        }

这就是我想要实现的目标:

foo(MyConverter(tableName), value);

在乞讨时虽然不是很优雅,但我认为我可以侥幸逃脱,但随着代码的增长,需要这种行为的函数越来越多,不仅仅是 Foo。

现在我有 foo2(value1, value2) foo3(value1, value2, value3) 等等。

我不太擅长代表,我知道必须有某种方法可以自动实现这一点,但我就是想不通。

有更好的想法吗?

谢谢。

4

1 回答 1

2

您可以尝试将字符串映射到操作的字典。

所以像:

Dictionary<string, Action<ParamWrapper>> tableActions 
    = new Dictionary<string, Action<ParamWrapper>>();

tableActions.add("product", foo<Entities.Product>);
tableActions.add("customer", foo<Entities.Customer>);

//to call a function, just do this
tableActions["product"](valueWrapper);

其中 foo 定义为

void foo<T>(ParamWrapper paramWrapper) {...}

至于处理 foo 的各种参数,您可以将所有参数包装到某个新类型 ParamWrapper 的对象中。当调用 foo 时,它会从 ParamWrapper 中提取参数。

如果您在编译时不知道所有表名,或者只是想要这个动态,那么您会想要使用反射,并将反射函数添加到字典中。

于 2013-05-30T15:40:52.213 回答