z00*_*00l 2 c# reflection getter inheritance
当第一次访问几个getter中的一个时,我正试图找到一种巧妙的方法来触发加载机制.我的第一个想法是这样的:
public class Customer {
private bool loaded = false;
public int PK { get; set; }
public string Email { get; set; }
public string Name { get { if (!loaded) loadData(); return _name; } set { ... } }
public string Street { get { if (!loaded) loadData(); return _street; } set { ... } }
public string City { get { if (!loaded) loadData(); return _city; } set { ... } }
}
Run Code Online (Sandbox Code Playgroud)
简而言之,在此示例中,每个都Customer存在其基础数据PK,Email直到访问其他属性之一.
这将意味着更多的重复代码,随着类的复杂性而增加.有没有办法为这些属性创建某种继承?
像这样的东西,但我不认为这是可能的:
private void checkData() { if (!loaded) loadData(); }
public string Name:checkData { get; set; }
public string Street:checkData { get; set; }
public string City:checkData { get; set; }
Run Code Online (Sandbox Code Playgroud)
另一种方式可能是通过反思,但由于我没有经验,我不知道从哪里开始.
任何提示都深深感激!;-)
您可以使用Lazy<T>该类来包装辅助属性.这种方式loadData只有在调用任何辅助getter时才会执行,并且不会执行多次.
public class Customer
{
public int PK { get; set; }
public string Email { get; set; }
public string Name { get { return data.Value.Name; } }
public string Street { get { return data.Value.Street; } }
public string City { get { return data.Value.City; } }
public Customer()
{
data = new Lazy<CustomerData>(loadData);
}
private CustomerData loadData()
{
...
}
private struct CustomerData
{
public string Name, Street, City;
}
private Lazy<CustomerData> data;
}
Run Code Online (Sandbox Code Playgroud)