【问题标题】:How do I send a parameter list to be used as arguments when a delegate is invoked?如何在调用委托时发送参数列表以用作参数?
【发布时间】:2011-09-25 04:24:45
【问题描述】:

我在我的 asp.net mvc 3 应用程序中实现了一个简单的扩展方法,以使用泛型将对象拉出会话:

public static T GetVal<T>(this HttpSessionStateBase Session, string key, Func<T> getValues)
    {
        if (Session[key] == null)
            Session[key] = getValues();

        return (T)Session[key];
    }

如果 getValues() 不需要任何参数,这将非常有用。

我试图编写一个接收 params object[] args 的重载,以允许我在必要时将参数传递给 getValues() 函数,但我不知道语法是什么将这些变量应用于函数。

这甚至可能吗?提前感谢您的建议。

【问题讨论】:

    标签: c# .net asp.net-mvc-3 delegates arguments


    【解决方案1】:

    我认为您不需要这样做 - 调用者可以使用 lambda 表达式来处理它。例如:

    int x = session.GetVal<int>("index", () => "something".IndexOf("o"));
    

    在这里,我们捕捉到在 "something" 上调用 IndexOf 并传入参数 "o" 的想法。所有这些都记录在一个简单的Func&lt;int&gt; 中。

    【讨论】:

    • 好的,乔恩,你在这里获得了赞成票……在这种情况下,我的 GetVal 函数会是什么样子?
    • 是的,刚刚看到...太棒了!所以在我的 () => 我可以调用任何我想要的方法,并将结果或实际方法传递给扩展中的 getValues 调用?我想我不完全清楚这里发生了什么。
    • @IronicMuffin:编译器会为你创建一个委托;只有在调用委托时才会调用代码。是时候阅读 lambda 表达式了,我想 :)
    • 我经常将 lambdas 与扩展方法一起使用……只是从未见过空的 () => myFunc() 格式。谢谢!
    【解决方案2】:

    你可以给你的函数添加一个重载

    public static T GetVal<T>(this HttpSessionStateBase Session, string key, Func<IList<object>,T> getValues, IList<object> args)
    {
        if (Session[key] == null)
            Session[key] = getValues(args);
    
        return (T)Session[key];
    }
    

    【讨论】:

    • 所以这会被一个新的 IList() { value1, value2, ... } 调用?
    【解决方案3】:

    您必须定义自己的委托而不是 Func。以下将在这里完美工作:

    public delegate TResult ParamsFunc<TResult>(params object[] args);
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2021-07-01
      • 2013-11-17
      相关资源
      最近更新 更多