为多个getter执行的常见操作

时间:2015-09-28 08:01:24

标签: c# inheritance reflection getter

当我第一次访问其中一个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都存在其基本数据PKEmail,直到访问其他属性之一。

这将意味着更多的重复代码,随着类的复杂性而增加。有没有办法为这些属性创建某种继承?

这样的事情,但我认为这不可能:

private void checkData() { if (!loaded) loadData(); }
public string Name:checkData { get; set; }
public string Street:checkData { get; set; }
public string City:checkData { get; set; }

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

任何提示都深表感谢! ; - )

2 个答案:

答案 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

请注意,这会降低性能,因为您的属性总是会调用额外的方法。您可以尝试强制编译器内联该方法(如果它还没有发生)。