在C#中使用泛型

时间:2011-09-10 17:57:26

标签: c# silverlight generics mef

我在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();
                    }
                });

        }

1 个答案:

答案 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 );

那就是说,我仍然更喜欢过载。 :)