Использование дженериков в C # - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть следующее в проекте Silverlight 4 MVVM.У меня есть несколько методов, таких как DeleteTeacher (p), DeleteRecordOfEntity2 (p), ... и т. Д. В моей модели представления, которые могут удалить, например, учителя из коллекции учителей.

Я хочу иметь возможность вызыватьметод DeleteMyData, передавая различные типы сущностей, например, так: DeleteMyData <<em> Student > ();DeleteMyData <<em> 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();
                    }
                });

        }

1 Ответ

2 голосов
/ 10 сентября 2011

Нет прямого пути.Вы можете попытаться отразить или сравнить имена типов в некрасивом операторе 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 );

Тем не менее, я все еще люблю перегрузки лучше.:)

...