1 つのクラスのベースであるプライベート メソッドを呼び出すにはどうすればよいですか?
これが私の構造の基本的な例です(そのコードは参照に含まれています):
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;
が得られます。ここのようなコードを使用すると、 internal について叫んでいる Exception が発生します。callme
null
NullReferenceException
私のハックで、NullReferenceException
これまでのところ私のせいでライブラリ内に作成しました。上記のコードは現在修正されています (簡略化中に 3 つの間違いがありました)。