我需要帮助访问给定类中的类属性。
例如,参加以下课程:
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类中的所有属性?
谢谢!
答案 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
}
}