使用表达式参数化属性名称

时间:2011-05-18 14:10:48

标签: c# expression-trees

我有一段代码,如果类存在,我会将类的某些属性委托给另一个类。您可以在下面看到TimeProvider上定义的开始时间(如果存在)。

public override DateTime StartTime
{
   get
   {
       return (TimeProvider != null) ? TimeProvider.StartTime : base.StartTime;
   }
   set
   {
       if (TimeProvider != null)
       {
           TimeProvider.StartTime = value;
       }
       else
       {
           base.StartTime = value;
       }
    }
 }

现在我的'问题'是我有更多的属性(如endtime,currentime)我委托给TimeProvider,如果它不是null。所以我希望代码如下:

public override DateTime StartTime
{
   get
   {
       return GetTime(()=>StartTime);
   }
   set
   {
       SetTime(()=>StartTime)
    }
 }

其中()=> StartTime表达式有时在TimeProvider上“评估”,有时在类本身上“评估”(它们共享一个基类)。可以这样做吗?最好不要使用反射。

1 个答案:

答案 0 :(得分:1)

蛋糕

public class Foo
{
    private string _string1;
    public Foo foo { get; set; }

    private T GetProperty<T>(Func<Foo,T> getter)
    {
        return foo == null
                   ? getter(this)
                   : getter(foo);
    }

    private void SetProperty(Action<Foo> setter)
    {
        if (foo == null)
            setter(this);
        else
            setter(foo);
    }

    public string String1
    {
        get { return GetProperty(a => a._string1); }
        set { SetProperty(a => a._string1 = value); }
    }
}