gpt4 book ai didi

c# - 在 C# 中构建对象的更好方法

转载 作者:行者123 更新时间:2023-11-30 13:35:21 25 4
gpt4 key购买 nike

我有一个应用程序,我的对象类型继承自一个基类,该基类包含应用程序对象的大部分属性。所有对象类型都存储在数据库的一张表中。 “ClassType”列确定我将 SqlDataReader 行转换为的对象类型。

这是我当前的实现:

SqlDataReader dr = SqlServerHelper.ExecuteReader("MyStoreProc", MySqlParmas);

if(dr.HasRows)
{
while(dr.Read())
{
switch(dr["ClassType"].ToString())
{
case "ClassA":
//cast sqldatareader a ClassA object
ClassA a = new ClassFactory.CreateClassA(object p1, object p2);
case "ClassB":
//cast sqldatareader a ClassB object
ClassB b = new ClassFactory.CreateClassB(object p1, object p2);
//it continues for all objects with app....
}
}
}

dr.Close()

我的问题是它们是否是此类处理的更好实现?

最佳答案

这种方法适用于您不想切换到代码生成 ORM 的情况。

在您的对象表中,包含对象的完全限定类型名称。

然后,您可以执行以下操作:

    private Dictionary<String, Type> _objectTypes = new Dictionary<String, Type>();

public ObjectFactory()
{
// Preload the Object Types into a dictionary so we can look them up later
foreach (Type type in typeof(ObjectFactory).Assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(BaseEntity)))
{
_objectTypes[type.Name.ToLower()] = type;
}
}
}

现在,在预加载映射器的情况下,您可以将代码替换为:

    string objectName = dr["ClassType"].ToString().ToLower();
Type objectType;

if (_objectTypes.TryGetValue(objectName, out objectType))
{
return (BaseEntity)Activator.CreateInstance(objectType,reader);
}

将读取器传递给对象的构造函数,这样它就可以完全填充自身,这种类型的代码不属于工厂。

关于c# - 在 C# 中构建对象的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/300581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com