【问题标题】:Passing array of functions in c#在 C# 中传递函数数组
【发布时间】:2014-07-01 13:31:48
【问题描述】:

我想创建可以传递自定义函数/方法的列验证器。

编辑:我不需要动态构建这些函数,可以事先构建解决方案,并且我受限于 .net 3.5。基本上我正在尝试为我的 SSIS 脚本进程创建可重用的类。

我不知道如何在 C# 中做到这一点,所以我在 JavaScript 中创建了一个我想要实现的快速表示here

// Data extracted from file
var data = "2|User2|15\r\n3|User1|13";

// Define columns in file
var columnKeys = ["ID", "Username", "Age"];

// Custome column validation
var columnValidation = {
    "ID": function (value) {
        if (isNaN(value)) return false;
        else return true;
    },
    "Username": function (value) {
        return true;
    },
    "Age": function (value) {
        return true;
    }
};

var ValidateColumns = function (data, keys, rules) {
    var rowSep = "\r\n";
    var colSep = "|";

    // Get rows
    var rows = data.split(rowSep);
    _.each(rows, function (row) {
        // Get columns
        var columns = row.split(colSep);

        // Validate columns
        _.each(columns, function (column) {
            if (rules[keys[columns.indexOf(column)]](column)) {
                console.log("Column " + keys[columns.indexOf(column)] + ": Passed");
            }
            else {
                console.log("Column " + keys[columns.indexOf(column)] + ": Failed");
            }
        });
    });
};

ValidateColumns(data, columnKeys, columnValidation);

问题:

  1. 如何创建将进入的函数/方法?
  2. 如何在将验证列的类/方法中传递这些函数?

【问题讨论】:

    标签: c# javascript .net-3.5


    【解决方案1】:

    您应该阅读有关 Func 和 Actions 的信息

    如果你的函数返回一些东西(比如 bool!)和/或使用多个参数,你应该使用Func<TReturn,TParam1,TParam2>[] 并使用尽可能多的 TParam 参数。这些背后有很多功能,所以我建议你阅读它。这个链接看起来不错:Explanation of Func

    如果您的函数不带任何参数并返回 void(在您的示例中不是这种情况,抱歉),您可以使用 Action[],它的用法如下:

    Action action = () => //your function's code;
    //Lame example of using Action[]
    YourMethodThatTakesFuncAsParams(new Action[]{action,action,action});
    

    如果你所有的函数都返回不同的东西和/或使用不同的参数,我认为没有一个干净的解决方案来实现这一点。

    少量编辑(因为我无法评论内容!) 我认为 Ben 的回答是解决您的问题的最合适和最直接的方法

    【讨论】:

    • Dictionary<string, Func<object,bool>> validationRules = new Dictionary<string, Func<object, bool>>(); 这是我创建的。
    【解决方案2】:

    您正在寻找的是一个谓词。本质上,它表示具有可定义输入类型和布尔输出的函数。

    这是一个传递谓词数组的示例。

    //this is a Predicate<string> b/c it takes a string as input and outputs a boolean
    bool ExamplePredicate(string input)
    {
        return input == "something";
    }
    
    //function accepting an array of Predicate<string> as input
    bool Validate(Predicate<string>[] validators /*, other data input*/ )
    {
        //use the array of validators to process your data.
    }
    
    void Test()
    {
        //array of validators
        var validators = new Predicate<string>[]
        {
            aString => !string.IsNullOrEmpty(aString), // you can use lambda expressions
            ExamplePredicate               // or reference functions matching the predicate definitions
        }
        Validate(validators);
    }
    

    文档: http://msdn.microsoft.com/en-us/library/bfcke1bz(v=vs.110).aspx

    【讨论】:

    • 刚刚看到 Lajos 关于代表的帖子 - 这些也很好。稍微复杂一些,但也更强大。
    • 从 .NET 3.5 开始,Func&lt;T, bool&gt; 优先于 Predicate&lt;T&gt;。为此,他们做同样的事情,但大多数框架(以及所有 LINQ)都希望您使用更新的、更通用的Func-family of delegates。
    【解决方案3】:

    您正在寻找代表。请阅读 MSDN 文档。我可以为您提供以下特定链接:

    http://msdn.microsoft.com/en-us/library/aa288459%28v=vs.71%29.aspx

    http://msdn.microsoft.com/en-us/library/ms173172.aspx

    第一个是关于委托的教程,第二个是关于使用它们的教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 2015-01-12
      • 2013-06-26
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多