Подтвердить что ты не робот

Есть ли способ в С# переопределить метод класса с помощью метода расширения?

Были случаи, когда я хотел бы переопределить метод в классе с использованием метода расширения. Есть ли способ сделать это в С#?

Например:

public static class StringExtension
{
    public static int GetHashCode(this string inStr)
    {
        return MyHash(inStr);
    }
}

Случай, когда я хотел сделать это, - это сохранить хэш строки в базе данных и использовать это значение всеми классами, использующими хэш-класс строки (например, словарь и т.д.). ) Поскольку встроенный алгоритм хеширования .Net не гарантированно совместим с одной версией Framework до следующего, я хочу заменить его своим собственным.

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

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

4b9b3361

Ответ 1

Нет; метод расширения никогда не принимает приоритет над методом экземпляра с подходящей сигнатурой и никогда не участвует в полиморфизме (GetHashCode - это метод virtual).

Ответ 2

Если у метода есть другая подпись, тогда это можно сделать - так в вашем случае: нет.

Но в противном случае вам нужно использовать наследование, чтобы делать то, что вы ищете.

Ответ 3

Насколько я знаю, ответ отрицательный, поскольку метод расширения не является экземпляром. Это больше похоже на средство intellisense для меня, которое позволяет вам вызвать статический метод, используя экземпляр класса. Я думаю, что решение вашей проблемы может быть перехватчиком, который перехватывает выполнение определенного метода (например, GetHashCode()) и делает что-то еще. Чтобы использовать такой перехватчик (как и один проект Castle), все объекты должны быть инстансированы с использованием объект factory (или контейнер IoC в замке), чтобы его интерфейсы могли быть перехвачены через динамический прокси, сгенерированный во время выполнения. (Caslte также позволяет перехватывать виртуальных членов классов)