-1

我有 3 个具有相同属性的对象,每个对象都有 Id、Name 和 TypeCode。在数据库中,我们有一个包含 Id、Name 和 TypeCode 字段的第一个表,还有 3 个其他表,每个表包含每个对象的相应属性:

表 1:标识 | 姓名 | 类型代码

表 2:标识 | 函数名

表 3:标识 | 分析名称

表 4:标识 | 属性名称

我们有一个名为“GetProperties”的存储过程,它根据对象的 TypeCode 返回对象的属性。“GetProperties”接受一个参数,即对象 ID。在调用存储过程之前我们不知道 TypeCode。

如果 TypeCode 是一个函数,则返回以下字段:

ID、名称、类型代码、函数名称

如果 TypeCode 是 Analysis 则返回以下字段:

ID、名称、类型代码、分析名称

等等...

我创建了 4 个类:从 MyObject 类继承的 FunctionObject、AnalysisObject 和 PropertyObject。

public class MyObject
{
     public decimal Id;
     public string Name;
     public string TypeCode;
}

public class FunctionObject: MyObject
{
    public string FunctionName;
}

public class AnalysisObject: MyObject
{
    public string AnalysisName;
}

public class PropertyObject: MyObject
{
    public string PropertyName;
}

我创建了一个通用函数,允许我动态创建对象:

    public T GetObject<T>(string storedProcedure, List<DataBaseParameteres> parameters) where T: new()
{
    T result = new T();
    OpenConnection();
    SqlDataReader reader = ExecuteSqlCommand(storedProcedure, parameters);
    PropertyInfo[] properties = typeOf(T).GetProperties();

    if(reader.Read())
    {
        for(int i = 0; i<properties.Count(); i++)
        {
            object value = Convert.ChangeType(reader[properties[i].Name], properties[i].PropertyType);
            properties[i].SetValues(result, value, null);
        }
    }
    reader.Close();
    CloseConnection();
    return result;
}

该函数运行良好,我可以如下调用它并返回创建的对象:

MyObject obj1 = GetObject<MyObject>(obj1Id);

我现在的问题是我想知道如何修改通用方法“GetObject”来创建对象:FunctionObject、AnalysisObject 和 Propertyobject。调用函数时我对 TypeCode 没有任何想法,所以除非我有 TypeCode,否则我不能这样做:

FunctionObject obj2 = GetObject<FunctionObject>(obj2Id);
4

1 回答 1

0

我不认为,根据您的情况,可以创建这些类型的对象。原因是您已经在同一方法中嵌入了对存储过程的调用和对象的创建并将它们混合在一起。

我的建议是将存储过程的调用从该方法删除到另一个方法,将该存储过程执行到数据表并将该数据表传递给该方法。通过这种方式,您将TypeCode提前拥有,然后您可以使用工厂模式创建所需类型的对象。

同样通过这种方式,您还可以减少对反射的依赖,因此您的代码在性能方面可能会更好一些。

希望这可以帮助。

于 2014-04-16T10:35:42.007 回答