BindingList <T> .Sort () zachowuje się jak lista <T> .Sort ()

Próbuję napisać listę SortableBindingList, której mogę użyć dla mojej aplikacji. Znalazłem wiele dyskusji o tym, jak zaimplementować podstawową obsługę sortowania, tak aby BindingList posortowała, gdy zostanie użyta w kontekście DataGridView lub innej powiązanej kontroli, w tym tego postu z StackOverflow:
Sortowanie DataGridView i np. BindingList <T> w .NET

Jest to bardzo pomocne i zaimplementowałem kod, przetestowałem itd. I wszystko działa, ale w mojej szczególnej sytuacji muszę być w stanie obsłużyć proste wywołanie Sort () i użyć tego połączenia jako domyślnego IComparable. CompareTo (), aby wykonać sortowanie, zamiast wykonywać wywołanie ApplySortCore (PropertyDescriptor, ListSortDirection).

Powodem jest to, że mam dość dużo kodu, który zależy od wywołania Sort (), ponieważ ta konkretna klasa pierwotnie dziedziczyła z List i została ostatnio zmieniona na BindingList.

Tak więc mam klasę o nazwie VariableCode i klasę kolekcji o nazwie VariableCodeList. VariableCode implementuje IComparable, a logika w nim jest umiarkowanie złożona w oparciu o kilka właściwości itp. ...

public class VariableCode : ...  IComparable ...
{
    public int CompareTo(object p_Target)
    {
        int output = 0;
        //some interesting stuff here
        return output;
    }
}

public class VariableCodeList : SortableBindingList<VariableCode>
{
    public void Sort()
    {
        //This is where I need help
        //  How do I sort this list using the IComparable
        //  logic from the class above?
    }
}

Zrobiłem kilka nieudanych prób ponownego użycia metody ApplySortCore w sortowaniu (), ale to, co mi przeszkadza, polega na tym, że ApplySortCore oczekuje, że PropertyDescriptor zrobi to, a ja nie mogę dowiedzieć się, jak to zrobić, aby użyć IComparable .CompareTo () logika.

Czy ktoś może wskazać mi właściwy kierunek?

Wielkie dzięki.

EDYCJA: To jest ostateczny kod oparty na odpowiedzi Marca w przyszłości.

  /// <summary>
  /// Sorts using the default IComparer of T
  /// </summary>
  public void Sort()
  {
     sort(null, null);
  }
  public void Sort(IComparer<T> p_Comparer)
  {
     sort(p_Comparer, null);
  }
  public void Sort(Comparison<T> p_Comparison)
  {
     sort(null, p_Comparison);
  }
  private void sort(IComparer<T> p_Comparer, Comparison<T> p_Comparison)
  {

     m_SortProperty = null;
     m_SortDirection = ListSortDirection.Ascending;

     //Extract items and sort separately
     List<T> sortList = new List<T>();
     this.ForEach(item => sortList.Add(item));//Extension method for this call
     if (p_Comparison == null)
     {
        sortList.Sort(p_Comparer);
     }//if
     else
     {
        sortList.Sort(p_Comparison);
     }//else

     //Disable notifications, rebuild, and re-enable notifications
     bool oldRaise = RaiseListChangedEvents;
     RaiseListChangedEvents = false;
     try
     {
        ClearItems();
        sortList.ForEach(item => this.Add(item));
     }
     finally
     {
        RaiseListChangedEvents = oldRaise;
        ResetBindings();
     }

  }

questionAnswers(2)

yourAnswerToTheQuestion