在构造函数中分配类值?

时间:2013-01-04 13:09:44

标签: c# .net constructor

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

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

1 个答案:

答案 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);
        }
    }
}