2

问题:我想在类的构造函数中将数据库数据填充到类实例的属性和字段中。

  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 是一个函数而不是一个过程)。

4

1 回答 1

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);
        }
    }
}
于 2013-01-04T13:12:06.313 回答