从数据库读取lambda并执行

时间:2019-04-08 18:29:43

标签: c#

我需要创建一个CSV映射实用程序,允许用户定义从其CSV文件到内部类的映射。例如,用户可以将last_name列映射到client.Lastname属性。

许多值很简单-字符串last_name到字符串client.Lastname。有些将需要可以编码的转换-字符串age到int client.age。但是,某些值需要翻译。例如,一个客户的CSV值包含“ A”,“ B”或“ C”,而另一个客户具有“ R”,“ G”或“ B”,但是内部对象使用值1、2和3。在这种情况下我需要为每个客户提供一个类似于以下内容的例程:

string => {
   switch(string)
   {
       case "A":
          return 1;
       case "B":
          return 2;
       case "C"
          return 3;
       default:
          return 0;
    }
}

因此,我想做的是将lambda表达式与给定字段和客户的地图一起存储在地图数据库中。然后在为该客户转换CSV时阅读并执行该地图转换。因此,伪代码将如下所示:

//Read appropriate map for customer from map database
//For each row in CSV file
    //Read row
    //Create a new target object
    //For each column in column map
       //Find column in row -- string value = row[column]
       //If column has transformation, execute transform code -- var newvalue = map[column].transform(value);
       //Store value from column in target object property

我查看了诸如 CSVHelper 之类的实用程序,这些实用程序可用于定义转换-问题是,您必须在设计时知道需要进行哪些转换,而我正在尝试动态地进行转换运行时间,取决于哪个客户正在上载CSV。

有人做过这样的事情吗?有什么方法可以将上面的转换(使用switch语句)作为字符串存储在数据库中,重新读回并针对值执行它?

说明 从本质上讲,我们添加到系统中的每个新客户都将拥有他们自己的CSV格式-不幸的是,我们没有强迫他们使用标准CSV格式的奢望。但是,我也不想编辑代码并为每个知道如何将CSV数据转换为内部格式的新客户添加新的IF ... ELSE语句-我希望能够以某种方式将其配置并存储在我的内部映射表中。

有没有更好的方法来解决这个问题?

0 个答案:

没有答案