调用在基本泛型 class 中声明的非泛型方法会抛出异常并显示消息
Invoking a non-generic method which is declared in a base generic class throws exception with message
调用在基本泛型中声明的非泛型方法 class 抛出异常并显示以下消息:
"Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true"
我在反射方面有不错的经验,但我最近对代码所做的更改导致了一个非常罕见的情况,我无法弄清楚。
我在网上研究了很长时间,并且尝试了很多 possible/suggested 解决方案,但我找不到适合我这种罕见情况的解决方案。
网络上的所有示例都为泛型方法提供了解决方案,但就我而言,我尝试调用的方法不是泛型的。包含该方法的 class 不是通用的。 class 继承了一个基础 class 并且只有这个基础 class 是通用的。
任何人都可以告诉我关于正确调用属于非泛型 class 的非泛型方法的任何想法,该非泛型方法继承自泛型基础 class?
我将尝试找出问题并提供经过高度修剪的示例代码,以便您明白我的意思。
旁注:请不要建议我改变我的方法。我必须通过反射来做到这一点,这个 class 结构不能改变。我正在尝试为这个非常具体的案例找到解决方案。请不要成为不知道具体答案但试图说服我改变方法的人。
// Execution starts here in some code piece.
// We don't know the type of Instance.
// It can either be SubClassA or SubClassB.
{
// This finds the method correctly. It doesn't return null.
MethodInfo ValidationMethod = Instance.GetType().GetMethod("Validate", BindingFlags.NonPublic | BindingFlags.Instance);
// This throws the exception with the message shown above.
ValidationMethod.Invoke(Instance, null);
}
public class SubClassA : BaseClass<EventArgs>
{
}
public class SubClassB : BaseClass<CancelEventArgs>
{
}
public abstract class BaseClass<T>
{
void Validate()
{
Debug.Log("Validating");
}
}
正如评论所暗示的那样,问题中缺少一些东西。
然而,在所有条件都相同的情况下,这应该可行,关键是 BaseType
var subClassB = new SubClassB();
var ValidationMethod = subClassB.GetType()
.BaseType?
.GetMethod("Validate", BindingFlags.NonPublic | BindingFlags.Instance);
ValidationMethod?.Invoke(subClassB, null);
不需要反思。通常解决此问题的方法是使用非通用接口:
interface IBase
{
void Validate();
}
public abstract class BaseClass<T> : IBase
{
public void Validate()
{
Debug.Log("Validating");
}
}
public class SubClassA : BaseClass<EventArgs>
{
}
public class SubClassB : BaseClass<CancelEventArgs>
{
}
要调用 Validate()
,您需要使用:
IBase o = Instance;
o.Validate();
调用在基本泛型中声明的非泛型方法 class 抛出异常并显示以下消息:
"Late bound operations cannot be performed on types or methods for which ContainsGenericParameters is true"
我在反射方面有不错的经验,但我最近对代码所做的更改导致了一个非常罕见的情况,我无法弄清楚。
我在网上研究了很长时间,并且尝试了很多 possible/suggested 解决方案,但我找不到适合我这种罕见情况的解决方案。
网络上的所有示例都为泛型方法提供了解决方案,但就我而言,我尝试调用的方法不是泛型的。包含该方法的 class 不是通用的。 class 继承了一个基础 class 并且只有这个基础 class 是通用的。
任何人都可以告诉我关于正确调用属于非泛型 class 的非泛型方法的任何想法,该非泛型方法继承自泛型基础 class?
我将尝试找出问题并提供经过高度修剪的示例代码,以便您明白我的意思。
旁注:请不要建议我改变我的方法。我必须通过反射来做到这一点,这个 class 结构不能改变。我正在尝试为这个非常具体的案例找到解决方案。请不要成为不知道具体答案但试图说服我改变方法的人。
// Execution starts here in some code piece.
// We don't know the type of Instance.
// It can either be SubClassA or SubClassB.
{
// This finds the method correctly. It doesn't return null.
MethodInfo ValidationMethod = Instance.GetType().GetMethod("Validate", BindingFlags.NonPublic | BindingFlags.Instance);
// This throws the exception with the message shown above.
ValidationMethod.Invoke(Instance, null);
}
public class SubClassA : BaseClass<EventArgs>
{
}
public class SubClassB : BaseClass<CancelEventArgs>
{
}
public abstract class BaseClass<T>
{
void Validate()
{
Debug.Log("Validating");
}
}
正如评论所暗示的那样,问题中缺少一些东西。
然而,在所有条件都相同的情况下,这应该可行,关键是 BaseType
var subClassB = new SubClassB();
var ValidationMethod = subClassB.GetType()
.BaseType?
.GetMethod("Validate", BindingFlags.NonPublic | BindingFlags.Instance);
ValidationMethod?.Invoke(subClassB, null);
不需要反思。通常解决此问题的方法是使用非通用接口:
interface IBase
{
void Validate();
}
public abstract class BaseClass<T> : IBase
{
public void Validate()
{
Debug.Log("Validating");
}
}
public class SubClassA : BaseClass<EventArgs>
{
}
public class SubClassB : BaseClass<CancelEventArgs>
{
}
要调用 Validate()
,您需要使用:
IBase o = Instance;
o.Validate();