C# 构建工厂模式的通用方法

C# 构建工厂模式的通用方法,c#,.net,reflection,factory-pattern,generic-method,C#,.net,Reflection,Factory Pattern,Generic Method,我有3个对象,它们的属性相同,但有些不同,每个对象都有Id、名称和类型代码。 在数据库中,我们有一个包含Id、Name和TypeCode字段的第一个表,还有3个其他表,分别包含每个对象的相应属性: 表1:Id |名称|类型代码 表2:Id |函数名 表3:Id | AnalysisName 表4:Id | PropertyName 我们有一个名为“GetProperties”的storedProcdure,它根据对象的类型码返回对象的属性。“GetProperties”接受一个参数,即对象Id。

我有3个对象,它们的属性相同,但有些不同,每个对象都有Id、名称和类型代码。 在数据库中,我们有一个包含Id、Name和TypeCode字段的第一个表,还有3个其他表,分别包含每个对象的相应属性:

表1:Id |名称|类型代码

表2:Id |函数名

表3:Id | AnalysisName

表4:Id | PropertyName

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

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

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

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

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

等等

我创建了4个类:FunctionObject、AnalysisObject和PropertyObject,它们继承自类MyObject

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;
}
public T GetObject(字符串存储过程,列出参数),其中T:new()
{
T结果=新的T();
OpenConnection();
SqlDataReader=ExecuteSqlCommand(storedProcedure,参数);
PropertyInfo[]properties=typeOf(T).GetProperties();
if(reader.Read())
{

对于(int i=0;i我认为,根据您的场景,不可能创建这些类型的对象。原因是您在同一方法中嵌入了对存储过程的调用和对象的创建,并将它们混合在一起

我的建议是,删除该方法对另一个方法的存储过程调用,将该存储过程执行到一个datatable,并将该datatable传递给该方法。这样,您将提前获得
TypeCode
,然后可以使用factory模式创建所需类型的对象

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


希望这能有所帮助。

你一定要研究实体框架。我没有太多选择,我不能修改hole项目,不允许添加实体框架,我只需要修改这些类谢谢你的回答,因为我知道没有办法使用通用方法创建工厂模式?我认为你给出的方法是没有的不可能,因为在工厂模式中,您需要一些switch或if语句来创建相关的对象,例如“FunctionObject”,等等,但创建if语句本身在方法中的条件。您需要从该方法中删除SP调用,首先进行调用,然后调用此方法。也许您可以创建重载,以便使用此方法的其他代码不会中断。谢谢您的帮助。我创建了另一个允许映射对象属性的函数使用SqlDataReader字段,在调用它之前,我检查TypeCode,然后使用适当的对象类型调用此函数。
MyObject obj1 = GetObject<MyObject>(obj1Id);
FunctionObject obj2 = GetObject<FunctionObject>(obj2Id);