上下文如下: 我们有一个名为 Body 的基类,以及从基类 Body 继承的许多其他类。
public class Body{
//...
}
public class A : Body {
//...
}
public class B : Body {
//...
}
// and so on
有一个服务具有这样的通用方法:
public class TheService : ITheService
{
public void Receive<T>(T firstInput, bool secondOne) where T : Body
{
DoingStuff();
}
}
事情是这样的,对于所有从基类 Body 派生的类,我们必须调用 Receive 函数,所以我们这样做:
// 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<ITheService>();
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<T> : Body where T : class {
//...
}
foreach 代码块对于 A 类和 B 类来说是可以的,但是当它到达 C 时,它会抛出一个带有错误消息的异常。
ChatGPT 的回答: 您遇到的问题源于 MakeGenericMethod 方法无法处理尚未完全指定的泛型类型(即具有未分配类型参数的泛型类型)。 这是说我必须过滤掉开放泛型类型,但我需要它们,我不能过滤掉它们。
有人知道如何解决这个问题吗?
获取派生Body类的每个类的Type并检查它是否是通用的。
C 类中的 T 可以是任何类,但不可能随心所欲。