0

如果这看起来很像我几周前提出的类似问题,我深表歉意;我在学习。

我有一个函数应该返回一个对象列表——有点像工厂。在下面的示例中,我有两个类 Truck 和 Car,它们都继承自超类 Vehicle。该功能不起作用,但它应该显示我想要完成的事情。

编辑:忘了说它是如何不起作用的。好吧,该函数创建了一个列表,例如卡车,但不能返回它,因为返回值必须是车辆列表。我不知道如何转换创建的列表,或者即使它可以转换。

显然,我主要是在寻求建议如何让这该死的东西发挥作用!但我也很感激任何关于如何让它更具可扩展性的想法——为每个可能的 Vehicle 类都有一个“案例”声明并不会让我高兴。

v.Populate 函数只是用来用来自 DataReader 的数据填充对象。应该不会影响手头的问题。

调用该函数,在这种情况下,我想要一个带有卡车对象的列表: return PopulateList("Truck", gc);

private List<Vehicle> PopulateList(String type, GenericConnection gc)
{
    Vehicle v;
    var ret = new List<Vehicle>();
    var r = gc.ExecuteReader();
    while (r.Read())
    {
        switch (type)
        {
            case "Truck":
                v = new Truck();
                break;
            case "Car":
                v = new Car();
                break;
            default:
                throw new ArgumentException("Unknown Vehicle: " + type, "type");
        }
        v.Populate(r);
        ret.Add(v);
    }
    r.Close();
    return ret;
}

为清楚起见,这里是相同函数的副本,但现在所有非必要代码(主要与 DataReader 相关)都被删除了。返回值应该是一个列表,其中只有一个空对象。

private List<Vehicle> PopulateList(String type)
{
    Vehicle v;
    var ret = new List<Vehicle>();
    switch (type)
    {
        case "Truck":
            v = new Truck();
        case "Car":
            v = new Car();
        }
    }
    ret.Add(v);
    return ret;
}
4

3 回答 3

2

为什么不使用泛型:

public interface IPopulate {
   void Populate( DbDataReader dataReader );
}

....
private List<T> PopulateList<T>( GenericConnection gc )
    where T : IPopulate, new()
{
    T v;
    var ret = new List<T>();
    var r = gc.ExecuteReader();
    while (r.Read())
    {
        v = new T();
        v.Populate(r);
        ret.Add(v);
    }
    r.Close();
    return ret;
}

你会这样称呼它

PopulateList<Truck>( connection );
PopulateList<Car>( connection );
于 2012-12-05T14:49:12.320 回答
0

您可以创建通用方法:

private List<Vehicle> PopulateList<T>() where T: Vehicle
    {
        Vehicle v = new T();
        var ret = new List<Vehicle>();
        // main logic
        ret.Add(v);
        return ret;
    }
于 2012-12-05T14:54:18.023 回答
0

创建一个泛型方法:

public T CreateInstance<T>() where T : Vehicle, new()
{
    var obj = new T();
    return obj;
}

用法:

var truck = CreateInstance<Truck>();
var car = CreateInstance<Car>();
于 2012-12-05T15:00:30.170 回答