У нас есть базовый класс Body и множество других классов, унаследованных от базового класса Body.
Код: Выделить всё
public class Body{
//...
}
public class A : Body {
//...
}
public class B : Body {
//...
}
// and so on
Код: Выделить всё
public class TheService : ITheService
{
public void Receive(T firstInput, bool secondOne) where T : Body
{
DoingStuff();
}
}
Код: Выделить всё
// Getting all types that are inherited from the Body in the solution
var bodyTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(domainAssembly => domainAssembly.GetExportedTypes()).Where(type => typeof(Body).IsAssignableFrom(type)).ToArray();
// Get the Receive method
var theService = ServiceLocator.Current.GetInstance();
var receive = typeof(ITheService).GetMethod("Receive");
// And finally calling the Receive function for all types
foreach (var bodyType in bodyTypes)
{
var method = receive.MakeGenericMethod(bodyType);
method.Invoke(theService, new object[] { firstInput, secondOne });
}
Проблема здесь:
Если производные классы сами по себе являются универсальными , возникнет такая ошибка: Операции с поздним связыванием не могут быть выполнены с типами или методами, для которых параметр containsGenericParameters имеет значение true
Код: Выделить всё
public class C : Body where T : class {
//...
}
Ответ ChatGPT :
Проблема, с которой вы столкнулись, связана с тем, что метод MakeGenericMethod не может обрабатывать универсальные типы, которые не были полностью определены (т. е. универсальные типы с неназначенными параметрами типа).
Он говорит, что я должен фильтровать из открытых универсальных типов, но они мне нужны, я не должен их фильтровать.
Кто-нибудь знает, как решить проблему?
Подробнее здесь: https://stackoverflow.com/questions/784 ... reflection
Мобильная версия