繁体   English   中英

在C#中使用泛型

[英]Using generics in C#

我在Silverlight 4 MVVM项目中有以下内容。 我在viewmodel中有几个方法,如DeleteTeacher(p),DeleteRecordOfEntity2(p),...等,可以删除教师集合中的教师。

我希望能够通过传递不同的实体类型来调用DeleteMyData方法,如下所示:DeleteMyData < Student >(); DeleteMyData < Teacher >();

我如何在以下方法中动态地改变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();
                    }
                });

        }

没有一种直截了当的方式。 您可以在丑陋的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 );

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM