GetMethod 的 Type[] 以获取具有两个参数和一个类型参数的泛型方法
Type[] for GetMethod to get generic method with two arguments and one type parameter
如何接收通用方法存在许多变体:通过 LINQ 等在所有方法列表 (Type.GetMethods()) 中搜索或通过创建委托作为方法模板。
但有趣的是,为什么它不能通过反射使 classic GetMethod() 起作用。
在这种情况下,我们的主要问题是使用所需方法参数列表(方法签名)创建正确的 Type[]。
我可以理解这是 c# 的限制还是在这个例子中有其他解释?
最初我们有一个 class
public class MyClass
{
public static void AddLink()
{
Console.WriteLine("Hello from AddLink()");
}
public static void AddLink<T0>(UnityAction<T0> unityAction, UnityEvent<T0> unityEvent)
{
unityEvent.AddListener(unityAction);
}
public static void AddLink<T0, T1>(UnityAction<T0, T1> unityAction, UnityEvent<T0, T1> unityEvent)
{
unityEvent.AddListener(unityAction);
}
}
并且我们想通过使用 MethodInfo method = typeof(MyClass).GetMethod("AddLink", typeParameters)
来获取方法 void AddLink<T0>(UnityAction<T0> unityAction, UnityEvent<T0> unityEvent)
。我测试了 typeParameters
的不同变体
Type[] typeParameters = new Type[] {typeof(UnityAction<>), typeof(UnityEvent<>)};
Type[] typeParametersClosed = new Type[] { typeof(UnityAction<bool>), typeof(UnityEvent<bool>) };
Type[] typeParametersClosedGeneric = new Type[] { typeof(UnityAction<bool>).GetGenericTypeDefinition(), typeof(UnityEvent<bool>).GetGenericTypeDefinition()};
没有人给出结果。我可以通过在 GetMthods() 中搜索或将委托转换为要求类型来找到该方法:
var template = (Action<UnityAction<object>, UnityEvent<object>>)(MyClass.AddLink);
MethodInfo methodGeneric = template.Method.GetGenericMethodDefinition();
为了测试,我决定从 founded 方法中获取参数
Type[] typeParametersFromGeneric = GetParametersFromMethodInfo(methodGeneric);
public static Type[] GetParametersFromMethodInfo(MethodInfo method)
{
ParameterInfo[] parameterInfo = method.GetParameters();
int length = parameterInfo.Length;
Type[] parameters = new Type[length];
for (int i = 0; i < length; i++)
{
parameters[i] = parameterInfo[i].ParameterType;
}
return parameters;
}
:) 之后,使用最终的 Type[] (typeParametersFromGeneric) GetMethod 开始工作。
我比较了所有这些类型[](我在这里删除了第二个参数的信息,它是一样的):
主要问题是否可以从头开始创建 Type[] (typeParametersFromGeneric)?以及为什么不可能
您可以使用 Type.MakeGenericSignatureType
并将 Type.MakeGenericMethodParameter(0)
作为通用参数传递给它:
var methodInfo = typeof(MyClass)
.GetMethod(nameof(MyClass.AddLink), new[]
{
Type.MakeGenericSignatureType(typeof(UnityAction<>), Type.MakeGenericMethodParameter(0)),
Type.MakeGenericSignatureType(typeof(UnityEvent<>), Type.MakeGenericMethodParameter(0))
});
如何接收通用方法存在许多变体:通过 LINQ 等在所有方法列表 (Type.GetMethods()) 中搜索或通过创建委托作为方法模板。 但有趣的是,为什么它不能通过反射使 classic GetMethod() 起作用。 在这种情况下,我们的主要问题是使用所需方法参数列表(方法签名)创建正确的 Type[]。 我可以理解这是 c# 的限制还是在这个例子中有其他解释? 最初我们有一个 class
public class MyClass
{
public static void AddLink()
{
Console.WriteLine("Hello from AddLink()");
}
public static void AddLink<T0>(UnityAction<T0> unityAction, UnityEvent<T0> unityEvent)
{
unityEvent.AddListener(unityAction);
}
public static void AddLink<T0, T1>(UnityAction<T0, T1> unityAction, UnityEvent<T0, T1> unityEvent)
{
unityEvent.AddListener(unityAction);
}
}
并且我们想通过使用 MethodInfo method = typeof(MyClass).GetMethod("AddLink", typeParameters)
来获取方法 void AddLink<T0>(UnityAction<T0> unityAction, UnityEvent<T0> unityEvent)
。我测试了 typeParameters
Type[] typeParameters = new Type[] {typeof(UnityAction<>), typeof(UnityEvent<>)};
Type[] typeParametersClosed = new Type[] { typeof(UnityAction<bool>), typeof(UnityEvent<bool>) };
Type[] typeParametersClosedGeneric = new Type[] { typeof(UnityAction<bool>).GetGenericTypeDefinition(), typeof(UnityEvent<bool>).GetGenericTypeDefinition()};
没有人给出结果。我可以通过在 GetMthods() 中搜索或将委托转换为要求类型来找到该方法:
var template = (Action<UnityAction<object>, UnityEvent<object>>)(MyClass.AddLink);
MethodInfo methodGeneric = template.Method.GetGenericMethodDefinition();
为了测试,我决定从 founded 方法中获取参数
Type[] typeParametersFromGeneric = GetParametersFromMethodInfo(methodGeneric);
public static Type[] GetParametersFromMethodInfo(MethodInfo method)
{
ParameterInfo[] parameterInfo = method.GetParameters();
int length = parameterInfo.Length;
Type[] parameters = new Type[length];
for (int i = 0; i < length; i++)
{
parameters[i] = parameterInfo[i].ParameterType;
}
return parameters;
}
:) 之后,使用最终的 Type[] (typeParametersFromGeneric) GetMethod 开始工作。
我比较了所有这些类型[](我在这里删除了第二个参数的信息,它是一样的):
主要问题是否可以从头开始创建 Type[] (typeParametersFromGeneric)?以及为什么不可能
您可以使用 Type.MakeGenericSignatureType
并将 Type.MakeGenericMethodParameter(0)
作为通用参数传递给它:
var methodInfo = typeof(MyClass)
.GetMethod(nameof(MyClass.AddLink), new[]
{
Type.MakeGenericSignatureType(typeof(UnityAction<>), Type.MakeGenericMethodParameter(0)),
Type.MakeGenericSignatureType(typeof(UnityEvent<>), Type.MakeGenericMethodParameter(0))
});