当我第一次访问其中一个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 { ... } }
}
简而言之,在此示例中,每个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; }
另一种方式可能是通过反思,但由于我没有经验,我不知道从哪里开始。
任何提示都深表感谢! ; - )
答案 0 :(得分:8)
您可以使用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;
}
答案 1 :(得分:2)
还有另一种不那么漂亮的方式。您可以编写一个包装泛型方法,它可以减少属性中的代码。
以下是一个例子:
TransNo|TransId|createddate|order|tank|meter|quantity
请注意,这会降低性能,因为您的属性总是会调用额外的方法。您可以尝试强制编译器内联该方法(如果它还没有发生)。