用于构建工厂模式的通用方法

时间:2014-04-16 10:12:24

标签: c# .net reflection factory-pattern generic-method

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

表1:Id |名称|类型码

表2:Id | FunctionName

表3:Id | AnalysisName

表4:Id |的PropertyName

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

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

Id,Name,TypeCode,FunctionName

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

Id,Name,TypeCode,AnalysisName

等......

我创建了4个类:FunctionObject,AnalysisObject和继承自MyObject类的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);

1 个答案:

答案 0 :(得分:0)

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

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

同样以这种方式,您还可以减少对反射的依赖性,因此您的代码可能会更好地表现。

希望这有帮助。