Как скрыть закрытый метод базового класса в C #? - PullRequest
0 голосов
/ 08 мая 2019

Я не нашел ответа на свой вопрос, но он кажется простым.Основная большая проблема заключается в том, что я купил некоторую библиотеку и некоторые функциональные возможности, жестко запрограммированные внутри dll, и я не могу перекомпилировать эту dll без исходного кода.Итак, вот проблема школьного уровня:

У нас есть 2 класса A и B

class A {
    public void Method1() {
        this.Method2 ();
    }

    private void Method2() {
        WriteLine  ("A");
    }
}

class B : A {
    private void Method2() {
        WriteLine ("B");
   }
}

Если мы вызываем 'new B (). Method1 ()', то у нас есть строковая строка«А».Мы ничего не можем сделать с классом A, но мы можем изменить класс B. Мы должны получить строку "B".

Я пытался использовать модификатор 'new', но, как вы знаете,, это не помогает.Ответ «Просто переопределите Method1 также» не вариант, потому что реальный код намного больше.

Есть предложения?

1 Ответ

0 голосов
/ 08 мая 2019

Мне кажется, что вы пытаетесь переопределить Method2, чтобы заставить Method1 напечатать «B». Однако, поскольку Method2 является частным и не виртуальным в классе A, это невозможно , как определено языком C #.

Если мы можем пойти на компромисс, чтобы найти другой подход для достижения желаемых результатов, вот несколько советов.

Состав класса в качестве модифицированной котельной плиты:

class B
{
    private A;
    public void Method1() {
        this.Method2 ();
    }
    private void Method2() {
        WriteLine("B");
    }
    public void KeptMethod() {
        a.KeptMethod();
    }
}

Отражение для вызова / изменения приватных членов:

typeof(A).GetField("privateValue", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(a, "injected string");
typeof(A).GetMethod("privateMethod", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(a, new object[0]);

Я знаю, что у обоих есть свои недостатки и ограничения, но, поскольку я не знаю вашей реальной цели, мне трудно быть более конкретным.

...