0

我正在开发一个应用程序,该应用程序当前从 sql 查询的结果创建数据实体对象。在数据库中,表 3 非常相似,但有几个不同的属性。

我最初的计划是创建 3 个不同的类,尽管每个类都非常相似。然而,当我开始创建返回对象列表的方法时,我遇到了一个绊脚石,因为返回类型会根据应用程序所处的模式而有所不同。

例如

public class A
{
   public int Id {get;}
   public string Name {get;}
}

 public class B
 {
   public int Id {get;}
   public string Name {get;}
   public string ExtraInfo {get;}
 }


 public class MainScreen
 {
     ...
     this.resultsGrid.DataSource = LoadData();
 }

我不希望编写一种方法来加载每种数据类型的列表。LoadData() 的返回类型应该是什么,以使其尽可能通用。

处理这种情况的最优雅的方法是什么?

谢谢,

肖恩

4

3 回答 3

0

简单!

创建一个类ListItem(我想具有属性IdName)。在您的工厂类/方法中,将该类的实例从记录变为 aList并将数据源绑定到列表。

不要害怕为你的 UI 创建专门的类。

更新:忘了提。尽量避免继承。

于 2012-04-20T15:34:18.747 回答
0

您应该具有允许多态性的继承,因此您将拥有一个基类,数据绑定中包含的所有实体都从它派生。

然后,您可以拥有一个中间基类来拥有一些共享属性,例如名称和 ID。

基类:

public abstract class Entity
{
}

具有名称和 ID 的实体:

public class NameAndIDEntity : Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

具有名称、ID 和 ExtraInfo 的实体:

public class NameIDAndExtraEntity : NameAndIDEntity
{
    public string ExtraInfo { get; set; }
}

具有其他信息的实体(不能从 NameAndIDEntity 派生),从 Entity 派生,因此可以包含在数据绑定中:

public class OtherInformationEntity : Entity
{
    public int Age { get; set; }
}

最后,您可以使 LoadData 返回类型实体。

于 2012-04-20T15:27:38.063 回答
-1

首先,您可以在项目中创建一个继承树,其中基类在一组不同类型之间保存一个共享/公共属性

其次,您可以从查询匿名类型中检索,然后通过将它们映射到真实类型来将其映射到已知类型,例如 Jon Skeet 的博客Horrible grotty hack:returning an anonymous type instance

这意味着您需要知道哪个查询返回什么类型(无法避免),但这可以减少您需要添加到代码中的分数,例如:

static class GrottyHacks
{
    internal static T Cast<T>(object target, T example) //CAST TO SPECIFIED TYPE
    {
        return (T) target;
    }
}

class CheesecakeFactory
{
    static object CreateCheesecake()
    {
        return new { Fruit="Strawberry", Topping="Chocolate" };
    }

    static void Main()
    {
        object weaklyTyped = CreateCheesecake(); //ANONYMOUS TYPE GENERATION
        var stronglyTyped = GrottyHacks.Cast(weaklyTyped,
            new { Fruit="", Topping="" }); //"MAPPING"

        Console.WriteLine("Cheesecake: {0} ({1})",
            stronglyTyped.Fruit, stronglyTyped.Topping);            
    }
}
于 2012-04-20T15:23:16.503 回答