2011-09-10 66 views
0

我在Silverlight 4 MVVM项目中拥有以下内容。 我在我的视图模型中有几个方法,例如DeleteTeacher(p),DeleteRecordOfEntity2(p)等等,它可以从教师集合中删除例如教师。在C#中使用泛型

我希望能够通过使不同的实体类型,像这样来调用DeleteMyData方法: DeleteMyData < 学生>(); DeleteMyData < 教师>();

我如何动态地改变this.SelectedTeacher和this._myModel.DeleteTeacher(p)在下面的方法来处理不同的实体和不同的选定对象。

private void DeleteMyData<T>() where T : Entity 
     {     this.ModalDialogWorker.ShowDialog<T>(
       this.ModalDialog, this.CustomControl, this.SelectedTeacher, p => 
       { 
        if (this.ModalDialog.DialogResult.HasValue && 
         this.ModalDialog.DialogResult.Value) 
        { 

         this._myModel.DeleteTeacher(p);      


         this._myModel.SaveChangesAsync(); 
        } 
       }); 

     } 
+0

'_myModel'的类型是什么? –

回答

2

有没有一种简单的方法。您可以尝试反射或在丑陋的switch语句中比较类型名称。

但是,为什么不为每个对象创建重载?

private void DeleteMyData(Teacher teacher) { /* Delete Teacher code */ } 

private void DeleteMyData(Student student) { /* Delete Student code */ } 

然后调用它酌情:

private void DeleteMyData(this.SelectedTeacher); 

编辑:在您的例子再次寻找后,您还可以通过在处理该删除的委托。您的签名更改为:

private void DeleteMyData<T>(T value, Action<T> deleteAction) 
{ 
    this.ModalDialogWorker.ShowDialog<T>(
     this.ModalDialog, this.CustomControl, value, p => 
     { 
      if (this.ModalDialog.DialogResult.HasValue && 
       this.ModalDialog.DialogResult.Value) 
      { 
       deleteAction(p); 
       this._myModel.SaveChangesAsync(); 
      } 
     }); 
} 

然后你就可以使用它像:

DeleteMyData(this.SelectedTeacher, this._myModel.DeleteTeacher); 

DeleteMyData(this.SelectedStudent, this._myModel.DeleteStudent); 

这么说,我还是喜欢重载更好。 :)

+0

John,_myModel是我的viewmodel的一个接口。保罗,谢谢你的帮助。第二种选择更多的是我正在寻找的东西。将试一试并回复你。 – user938455

+0

保罗,刚刚确认你的第二个选择做到了。再次感谢 ! – user938455

+0

没问题。如果你愿意,随意标记为答案。 –