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呼び出しです。これをそのままにしておくことをお勧めします(GetClassは関数であり、プロシージャではないため)。Activator.CreateInstanceModels.Profile

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 に答える