gpt4 book ai didi

c# - 从抽象类反射(reflect)一个实现的私有(private)方法?

转载 作者:行者123 更新时间:2023-11-30 21:06:34 24 4
gpt4 key购买 nike

如何调用一个类的基类的私有(private)方法?

这是我的结构的一个基本示例(该代码包含在引用中):

public abstract class Something {
}
internal class ImplBase : Something {
private void CallMe(string s) {}
}
internal class RealImpl : ImplBase {
}

到目前为止,我有一个 RealImpl 的实例,它显示为 Something。如何访问方法 CallMe

我在这里尝试这段代码:

Type type = obj.GetType(); // returns RealImpl
bool supported = false;
// a loop to be a little more flexible
for(Type t = type; t.Name != "Object"; t = t.BaseType) {
if(t.Name == "ImplBase") {
supported = true;
type = t;
break;
}
}
if(supported) {
var callme = type.GetMethod("CallMe", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, new ParameterModifier[] {});
callme.Invoke(obj, new object[] { "hi" });
} else {
throw new NotSupportedException("The type " + type.Name + " is not supported.");
}

如果我注释掉 type = t;,我将为 callme 获取一个 null 值。如果我像这里一样使用代码,我会收到关于内部 NullReferenceException 的异常。


通过我的 hack,我在库中产生了一个 NullReferenceException 到目前为止是我的错。上面的代码现已修复(简化时有 3 个错误)。

最佳答案

您的方法名为 callMe,而不是 CallMe,因此请将其更改为:

var callme = type.GetMethod("callMe"...

还在 obj 上调用它(不确定 self 是什么):

callme.Invoke(obj, new object[] { "hi" });

此外,您不需要所有代码来确定 obj 是否为 ImplBase:

if(obj is ImplBase) 
{
var callme = type.GetMethod("callMe", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, new ParameterModifier[] {});
callme.Invoke(obj, new object[] { "hi" });
}

关于c# - 从抽象类反射(reflect)一个实现的私有(private)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com