为多个getter执行的常见操作

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)

另一种方式可能是通过反思,但由于我没有经验,我不知道从哪里开始.

任何提示都深深感激!;-)

Pet*_*nov 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;
    }
Run Code Online (Sandbox Code Playgroud)