问题:我想在其构造函数中将数据库数据填充到类的实例的属性和字段中。
public class Profile : ProfileOverview
{
public Profile()
{ }
public Profile(long ProfileId)
{
using (System.Data.IDbCommand cmd = Settings.DAL.CreateCommand("SELECT * FROM Profiles WHERE ProfileId = @__in_profileid"))
{
Settings.DAL.AddParameter(cmd, "__in_profileid", ProfileId);
this = Settings.DAL.GetClass<Models.Profile>(cmd);
} // End Using cmd
} // End Constructor
... (some properties and fields)
}
问题是,编译器说它不能分配“this”,因为它是写保护的。 是否真的有必要更改我的数据库抽象层以将“this”传递给它,或者我可以以某种方式这样做吗?
问题是,GetClass
调用Activator.CreateInstance
来创建Models.Profile
的新实例,我宁愿保持这种方式(因为GetClass是一个函数,而不是一个过程)。
答案 0 :(得分:5)
您无法指定this
。考虑改变你的模式:
public class Profile : ProfileOverview
{
public Profile()
{ }
public static Profile Get(long ProfileId)
{
using (System.Data.IDbCommand cmd = Settings.DAL.CreateCommand("SELECT * FROM Profiles WHERE ProfileId = @__in_profileid"))
{
Settings.DAL.AddParameter(cmd, "__in_profileid", ProfileId);
return Settings.DAL.GetClass<Models.Profile>(cmd);
} // End Using cmd
}
... (some properties and fields)
}
<强>更新强>
根据@CodeInChaos和@weston的评论,我在这里添加以上代码糟糕设计是公平的。理想情况下,静态加载器方法应该位于不同的类中,其目的是加载Profile
。请考虑以下基本示例:
public class Profile : ProfileOverview
{
public Profile() { }
... (some properties and fields)
}
public class ProfileHelper
{
public Profile LoadProfileById(long ProfileId)
{
using (System.Data.IDbCommand cmd = Settings.DAL.CreateCommand("SELECT * FROM Profiles WHERE ProfileId = @__in_profileid"))
{
Settings.DAL.AddParameter(cmd, "__in_profileid", ProfileId);
return Settings.DAL.GetClass<Models.Profile>(cmd);
}
}
}