2012-08-04 69 views
0

是否可以獲取對象的類型並將其動態設置爲對象。我有幾個的ViewModels,所有包含相同的屬性,並希望做這樣的事情獲取對象的類型並將其動態設置爲對象

if (this.DataContext is CamerasViewModel) 
{ 
    //Type type = Type.GetType((this.DataContext.ToString()); 
    object o = Assembly.GetExecutingAssembly().CreateInstance(this.DataContext.GetType().ToString()); 
    Type type = o.GetType(); 

    foreach (ButtonViewModel button in (this.DataContext as type).Buttons) 
    { 
     if (button.DisplayName == this.Content.ToString()) 
     { 
      this.Template = (ControlTemplate)this.FindResource(button.TemplateResource.Substring(0, button.TemplateResource.Length - 3) + "pr"); 
      break; 
     } 
    } 
} 

與其說this.DataContext作爲CamerasViewModel我想說this.DataContext作爲THEDYNAMICTYPE

任何建議嗎?

+0

不,你不能。如果你做了,你的下一步會是什麼?此外,你已經做了靜態檢查。我不明白你爲什麼會遇到問題。 – leppie 2012-08-04 18:48:23

+0

你想在這裏完成什麼?由於你的第一個「if」語句,你已經知道this.DataContext是一個CamerasViewModel。你只是試圖在ButtonViewModel的集合叫做「按鈕」的任何對象上設置button.DisplayName? – 2012-08-04 18:50:17

+0

問題是泰迪厄斯其他所有其他類型的ViewModels。但根據你的評論,看起來像不可能。 Activator.CreateInstance什麼都不會滿足? – bl4kh4k 2012-08-04 18:50:27

回答

3

您可能會更好地考慮您想要更新模板的Buttons屬性的所有類,並讓它們實現一個接口。該界面將是這個樣子:

public interface IHasButtons 
{ 
    public IEnumerable<ButtonViewModel> Buttons {get; set;} 
} 

和您的視圖模型會像這樣聲明:

public class CamerasViewModel : IHasButtons 
{ 
    public IEnumerable<ButtonViewModel> Buttons {get {. . .} set {. . .} } 
    . . . 
} 

然後,在你的if語句,而不是檢查如果對象是一個CamerasViewModel,檢查它是否是IHasButtons。這樣做比在運行時確定對象上是否有Buttons屬性要安全得多。你可能會不幸運行並且運行一個Buttons屬性,它具有相同的名稱,但功能與您所期望的不同。然後,你回來寫瘋狂的邏輯,以確定這是否真的是你正在尋找的按鈕集合。如果你使用接口來做,它非常清楚。如果一個ViewModel實現了IHasButtons,那麼它就是你想要更新的ViewModel。如果它沒有實現IHasButtons,你會跳過它

+0

更有意義。假設dyanmic類型真的是這樣,實現接口聽起來更安全。乾杯。 – bl4kh4k 2012-08-04 19:00:08

相關問題