美好的一天,
我遇到的情况是我使用的代码包含一个名为ImportFileContext的类。代码如下:
// One of 5 different types can be passed in
public AddImportData(CustomType ModelData)
{
// Depending on which 5 different types, the formatted type will change
FormattedType data = ConvertModelDataToFormattedData(ModelData);
using (var db = new ImportFileContext())
{
// Can this next line be made dynamic?
db.ImportFormattedData.Add(data);
db.SaveChanges();
}
}
基本上,CustomType将始终传递给方法。但是,有五种不同的自定义类型可以传入。根据传入的5,可以修改数据。
用例:
所以我正在寻找的方法是根据数据类型向List添加项目,而不必编写几种不同的方法来测试我正在接收哪种类型然后添加项目。我知道战略模式,我可以使用它,但是如何将项目添加到列表中呢?
我真的试图避免编写看起来像这样的代码:
// One of 5 different types can be passed in
public AddImportData(CustomType ModelData)
{
// Depending on which 5 different types, the formatted type will change
FormattedType data = ConvertModelDataToFormattedData(ModelData);
using (var db = new ImportFileContext())
{
if (typeof(ModelData) == "CustomType")
db.ImportFormattedData.Add(data);
elseif (typeof(ModelData) == "CustomType1")
db.ImportCsvData.Add(data);
elseif (typeof(ModelData) == "CustomType2")
db.ImportTabDelimetedData.Add(data);
db.SaveChanges();
}
}
TIA,
COSON
答案 0 :(得分:0)
听起来像你正在寻找双重调度。您可以使用访问者模式执行此操作 - 这基本上是David Mason详细说明的内容 - 您可以通过将逻辑(访问)放入包含数据的类来将算法与数据分离。这当然有效,但要求您修改算法之外的类才能访问。
我发现这个复杂而且它确实存在,因为静态类型的面向对象语言通常不会运行时重载。幸运的是,在C#4中,他们引入了dynamic
关键字,它允许使用更容易实现双调度 - 或者至少以一种看起来更像方法重载的方式。这意味着您创建方法重载,将值赋给动态变量,然后调用该方法。将在运行时根据值选择获取调用的方法。例如:
public static void AddImportData(CustomType ModelData)
{
FormattedType data = ConvertModelDataToFormattedData(ModelData);
using (var db = new ImportFileContext())
{
dynamic temp = ModelData;
ImportData(ModelData, data, db);
}
}
private static void ImportData(CustomType modelData, FormattedType data, ImportFileContext db)
{
db.ImportFormattedData.Add(data);
db.SaveChanges();
}
private static void ImportData(CustomType1 modelData, FormattedType data, ImportFileContext db)
{
db.ImportCsvData.Add(data);
db.SaveChanges();
}
private static void ImportData(CustomType1 modelData, FormattedType data, ImportFileContext db)
{
db.ImportTabDelimetedData.Add(data);
db.SaveChanges();
}