2011-05-18 94 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

相關問題