2011-05-18 96 views
2

我有一段代码,如果类存在,我将某个类的某些属性委托给另一个类。在下面,您会看到TimeProvider上定义的开始时间(如果存在)。使用表达式参数化属性名称

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

现在我的“问题”是,我有更多的属性(比如结束时间,currentime)我委托给TimeProvider,如果它不为空。因此,我希望有这样的代码:

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

凡()=>开始时间表达有时在TimeProvider类本身“评价”和有时(它们共享一个基类)。可以这样做吗?最好不使用反射。

+0

什么是你的最终目标是什么?通过实现ITimeProvider接口可以实现更轻松吗?你可能可以做一些使用属性名称和反射的东西。 – BenCr 2011-05-18 14:14:46

+0

这两个类已经共享相同的ITimeProvider接口。只有我想写所有的代表团检查一次。 – Gluip 2011-05-18 14:16:53

+0

如果您的课程是ITimeProvider,您为什么不设置这个.StartTime?你能否提供一些关于你为什么要这样做的背景?我不太明白。 – BenCr 2011-05-18 14:19:21

回答

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); } 
    } 
} 
+0

不错...这就是我的意思 – Gluip 2011-05-20 18:51:12

相关问题