使用反射将泛型类传递给泛型方法

问题描述 投票:0回答:1

上下文如下: 我们有一个名为 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 方法无法处理尚未完全指定的泛型类型(即具有未分配类型参数的泛型类型)。 这是说我必须过滤掉开放泛型类型,但我需要它们,我不能过滤掉它们。

有人知道如何解决这个问题吗?

c# generics reflection
1个回答
0
投票

获取派生Body类的每个类的Type并检查它是否是通用的。

C 类中的 T 可以是任何类,但不可能随心所欲。

© www.soinside.com 2019 - 2024. All rights reserved.