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

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

Сообщение Anonymous »

Вот контекст:
У нас есть базовый класс 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();
}
}
И вот в чем дело: для всех классов, производных от базового класса Body, мы должны вызвать функцию получения, поэтому мы делаем следующее:

Код: Выделить всё

// 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 {
//...
}
Блок кода foreach подходит для классов A и B, но при достижении C он выдаст исключение с этим сообщением об ошибке.
Ответ ChatGPT :
Проблема, с которой вы столкнулись, связана с тем, что метод MakeGenericMethod не может обрабатывать универсальные типы, которые не были полностью определены (т. е. универсальные типы с неназначенными параметрами типа).
Он говорит, что я должен фильтровать из открытых универсальных типов, но они мне нужны, я не должен их фильтровать.
Кто-нибудь знает, как решить проблему?

Подробнее здесь: https://stackoverflow.com/questions/784 ... reflection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»