创建自定义属性类,以便在类

时间:2015-05-29 14:39:40

标签: c# properties

假设我有一个C#类,它有多个属性,如下所示:

private bool _var1Dirty = true;
private Double? _var1;
public Double? Var1
{
    get
    {
        if (_var1Dirty)
        {
            _var1 = Method_Var1();
            _var1Dirty = false;
        }
        return _var1;
    }
}

每个属性之间的唯一区别是:

  1. 返回var的类型(在这种情况下为Double?,但可以很容易intstring等)
  2. 方法调用 - Method_Var1()(每个属性都有不同的属性)
  3. 有什么方法可以把它写成自定义类吗?

    有些事情:

    public class Prop
    {
        public delegate T Func();
    
        private bool _dirty = true;
        private T _val;
        public T Val
        {
            get
            {
                if (_dirty)
                {
                    _val = Func;
                    _dirty = false;
                }
                return _val;
            }
        }
    }
    

    然后我可以传入:

    1. 返回类型T
    2. 方法Func
    3. (PS - 我知道这不会编译/错误,但我想知道我在寻找什么)

      非常感谢任何帮助/指导。

      感谢!!!

1 个答案:

答案 0 :(得分:3)

你很亲密。你可以按照以下方式做点什么:

public class Dirty<T>
{
    public Dirty(Func<T> valueFactory)
    {
        this.valueFactory = valueFactory;
        dirty = true;
    }

    private Func<T> valueFactory;
    private bool dirty;
    private T value;

    public T Value
    {
        get
        {
            if (dirty)
            {
                value = valueFactory();
                dirty = false;
            }

            return value;
        }
    }
}

你就像这样消费它:

Dirty<double?> dirtyDouble = new Dirty<double?>(() => SomethingThatReturnsADouble());
double? value = dirtyDouble.Value;

我不确定脏检查实际上做了什么,但是如果你需要比bool更复杂的人,你总是可以将它变成某些Func<T>检查肮脏。

修改

鉴于@mikez评论和你的回答,你可以使用内置的Lazy<T>来保存自己Dirty<T>类的创建,这也保证了线程安全:

public class F
{
    private Lazy<double?> lazyDouble = new Lazy<double?>(() => 
                                           MethodThatReturnsNullableDouble(), true);
    public double? Value 
    { 
        get 
        {
            return lazyDouble.Value;
        }
    }
}