我在Silverlight 4 MVVM项目中有以下内容。 我在viewmodel中有几个方法,如DeleteTeacher(p),DeleteRecordOfEntity2(p),...等,可以删除教师集合中的教师。
我希望能够通过传递不同的实体类型来调用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 :(得分: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 );
那就是说,我仍然更喜欢过载。 :)