我想创建列验证器,我可以传递自定义函数/方法。
编辑:我不需要动态构建这些功能,可以事先构建解决方案,而且我受限于.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);
问题:
答案 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
第一个是关于代表的教程,第二个是关于使用它们的。