Как я могу назвать частный метод базой одного класса?Отразить частный метод реализации из абстрактного класса?
Вот простой пример моей структуры (этот код включен со ссылкой):
public abstract class Something {
}
internal class ImplBase : Something {
private void CallMe(string s) {}
}
internal class RealImpl : ImplBase {
}
До сих пор у меня есть instanence из 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
.
С моим хака я произвел NullReferenceException
внутри Lib до сих пор моя вина. Приведенный выше код теперь исправлен (при упрощении было 3 ошибки).
Вы указали мне на две небольшие ошибки в моем примере кода. Это не моя ошибка. Но спасибо вам все равно +1 :) О вашем редактировании: мне очень нравится этот оператор 'is', но класс' ImplBase' является внутренним внешним lib. Так что это не сработает. – rekire
@rekire Ваш примерный код отлично работает с изменениями, которые я рекомендовал. Что такое ошибка? –
Эти проблемы, о которых вы указали, являются просто глупыми ошибками, делая эту проблему более общей. Мой настоящий код (только с другими именами, такими как * self *), код работает.За исключением того, что я получаю 'TargetInvocationException' с внутренним' NullReferenceException'. – rekire