获取对象类型并将其动态设置为对象

时间:2012-08-04 18:44:00

标签: c#

是否可以获取对象类型并将其动态设置为对象。我有几个ViewModel都包含相同的属性,并希望做这样的事情

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

有什么建议吗?

1 个答案:

答案 0 :(得分: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属性,它具有相同的名称,但功能与您期望的不同。然后你回来编写疯狂的逻辑来确定这是否真的是你正在寻找的Buttons集合。如果你使用接口,它非常清楚。如果ViewModel实现了IHasButtons,那么它就是您要更新的ViewModel。如果它没有实现IHasButtons,你将跳过它