在c#中传递函数数组

时间:2014-05-13 18:13:47

标签: c# javascript .net-3.5

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

编辑:我不需要动态构建这些功能,可以事先构建解决方案,而且我受限于.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. 如何在将验证列的类/方法中传递这些函数?

3 个答案:

答案 0 :(得分:2)

您应该阅读有关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的答案是解决问题的最恰当和最直接的方法

答案 1 :(得分:1)

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

以下是传递Predicates数组的示例。

//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

答案 2 :(得分:0)

您正在寻找代表。请阅读MSDN文档。我可以告诉你这些特定的链接:

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

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

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