需要进行房产访问的进修课程

时间:2010-05-26 16:46:39

标签: c# properties

我需要帮助访问给定类中的类属性。

例如,参加以下课程:

public partial class Account
    {
        private Profile _profile;
        private Email _email;
        private HostInfo _hostInfo;

        public Profile Profile
        {
            get { return _profile; }
            set { _profile = value; }
        }

        public Email Email
        {
            get { return _email; }
            set { _email = value; }
        }

        public HostInfo HostInfo
        {
            get { return _hostInfo; }
            set { _hostInfo = value; }
        }

在“Account”类中存在一堆类属性,例如Email或Profile。 现在,当我想在运行时访问这些属性时,我会做这样的事情 (电子邮件):

    _accountRepository = ObjectFactory.GetInstance<IAccountRepository>();
    string username = Cryptography.Decrypt(_webContext.UserNameToVerify, "verify");
    Account account = _accountRepository.GetAccountByUserName(username);

    if(account != null)
    {
        account.Email.IsConfirmed = true;

但是,对于account.Email,我得到“对象引用未设置...”...为什么? 如何访问帐户,例如account.Email,account.Profile等 返回给定AccountId或UserName的正确数据。

    Here is a method that returns Account:

public Account GetAccountByUserName(string userName)
{
    Account account = null;

    using (MyDataContext dc = _conn.GetContext())
    {
        try
        {
            account = (from a in dc.Accounts
                       where a.UserName == userName
                       select a).FirstOrDefault();
        }
        catch
        {
            //oops
        }
    }

    return account;

}

以上是有效的,但是当我尝试时:

 account = (from a in dc.Accounts
               join em in dc.Emails on a.AccountId equals em.AccountId
               join p in dc.Profiles on em.AccountId equals p.AccountId
               where a.UserName == userName
               select a).FirstOrDefault();

我仍在为我的电子邮件和个人资料获取对象引用例外 属性。这只是一个SQL问题还是我还需要其他东西 能够完全访问我的Account类中的所有属性?

谢谢!

4 个答案:

答案 0 :(得分:3)

你得到这个是因为电子邮件是另一个尚未分配的课程。你可以做的是在你的构造函数默认属性链接到其他类作为新项目。例如在你的ctor中:

public Account()
{
   // Set Defaults
   Email = new Email();
   Profile = new Profile();
   HostInfo = new HostInfo();
}

然后您可以根据需要设置它们的值。

答案 1 :(得分:2)

这看起来像是在属性上处理空值的情况。如果您希望存储或查询它,则应将Email属性初始化为null以外的其他属性,或者更改查询以便它们可以期望处理空值。此外,如果从数据库中获取空值,并且您的属性不能设置为null,则会出现相反的问题。

答案 2 :(得分:0)

只想添加:现在有一个更短的表单来声明琐碎的属性:

public Profile Profile { get; set; }
public Email Email { get; set; }
public HostInfo HostInfo { get; set; }

答案 3 :(得分:0)

您是自己声明这些属性,还是尝试从Linq-to-SQL中指示自动生成的代码?

如果这是自动生成的,其中Account表引用了Email表等,那么您可能只需要指定您希望在加载选项中加载这些对象:

using (MyDataContext dc = _conn.GetContext())
{
    var options = new DataLoadOptions();
    options.LoadWith<Account>(a => a.Email);
    options.LoadWith<Account>(a => a.Profile);
    options.LoadWith<Account>(a => a.HostInfo);

    dc.LoadOptions = options;

    try
    {
        account = (from a in dc.Accounts
                   where a.UserName == userName
                   select a).FirstOrDefault();
    }
    catch
    {
        //oops
    }
}