0

再会,

我有一种情况,我正在使用包含一个名为 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种,将修改数据。

用例:

  1. 传入的自定义类型,将数据格式化为特定格式,然后将该项目添加到数据库实例的列表中。
  2. 传入的自定义类型 2,将数据格式化为特定格式,然后将该项目添加到数据库实例的列表中。
  3. 传入的自定义类型 3,将数据格式化为特定格式,然后将该项目添加到数据库实例的列表中。

所以我正在寻找一种根据数据类型将项目添加到列表的方法,而无需编写几种不同的方法来测试我收到的类型然后添加项目。我知道策略模式并且我可以使用它,但是将项目添加到列表中呢?

我真的在努力避免编写如下所示的代码:

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

科森

4

2 回答 2

0

我不知道这对您的应用程序有多可行,但您始终可以将特定行为添加到 CustomType 类,并且子类可以根据需要实现它。

public class CustomType
{
    public virtual void FormatAndWriteToDB(DataBase db);
}

然后根据需要子类覆盖

public class CustomType1 : CustomType
{
    public override void FormatAndWriteToDB(DataBase db)
    {
        FormattedType data = ConvertModelDataToFormattedData(ModelData);
        db.ImportCsvData.Add(data);
    }
}

这将使您的代码在示例方法中非常干净:

public AddImportData(CustomType ModelData)
{
    ModelData.FormatAndWriteToDB(db);
    db.SaveChanges();
}

当然你可以稍微改变一下。例如,如果 FormattedType 调用对它们都是通用的,则可以将其保留在 AddImportData 方法中,并将其作为参数传递给 FormatAndWriteToDB 方法。

这样做的好处是未来的添加只需要实现 CustomType 的新子类,并且不需要对 AddImportData 进行修改。

于 2012-09-18T22:38:05.960 回答
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();
}

我在我的博客上有更多详细信息:http: //msmvps.com/blogs/peterritchie/archive/2010/05/24/using-the-dynamic-keyword-in-c-to-improve-object-orientation.aspx

于 2012-09-19T13:44:50.237 回答