Параметр типа разбиения C# в универсальном методе, если его вложенный класс

Я пытаюсь передать вложенный класс в универсальный метод, чтобы оценить все его классы, например

SharedClass.FindParentClass<GrandParent.Parent.Child>();

универсальный метод:

public void FindParentClass<T>() where T: ISomeInterface, new()
{
  //Break down T to all of its classes
}

Я хочу избежать этого:

SharedClass.FindParentClass<GrandParent,GrandParent.Parent,GrandParent.Parent.Child>();

Универсальный метод, который работает для кода выше:

public void FindParent<TGrandParent, TParent, TChild>() where TGrandParent : IGrandParent, new()
                                                         where TParent : IParent, new()
                                                          where TChild : IChild, new()
{
 //all I have to do now is place the type parameters there where I want them    
}

Мне не разрешено изменять классы, которые использовались в качестве параметров типа, поэтому каждый класс наследует другой интерфейс и имеет открытый конструктор без параметров.

1 ответ

  1. Чтобы работать так, как я намеревался, я должен был написать другой (частный) универсальный метод, который принимает все три параметра типа:

    private void PerformWith<GrandParent, Grandparent.Parent, GrandParent.Parent.Child>()
    {
             //Perform something
    }
    

    Поэтому в моем первом общем методе я буду использовать отражение для:

    1. Определите все родительские типы-с помощью GetTypeInfo ().ReflectedType
    2. Чтобы получить новый метод, сделайте его универсальным и вызовите его.

    Это выглядит так:

    public void FindParentClass<T> where T: ISomeInterface, new()
    {
       var parentClass = typeof(T).GetTypeInfo().ReflectedType;
       var grandparentClass = parentClass.GetTypeInfo().ReflectedType;
    
       var method = MethodBase.GetCurrentMethod().DeclaringType.GetMethod("PerformWith", BindingFlags.NonPublic());
       var genericMethod = method.MakeGenericMethod(new Type[] { grandparentClass, parentClass, typeof(T) });
       genericMethod.Invoke(null, null);
    }