Вы, по сути, наследуете кондукторов в том смысле, что вы можете просто называть супер, если и когда это уместно, это просто то, что он будет подвержен ошибкам по причинам, о которых другие говорили, если это произошло по умолчанию. Компилятор не может предположить, когда это уместно, а когда нет.
Задача компилятора - обеспечить как можно большую гибкость, уменьшая сложность и риск непредвиденных побочных эффектов.
Определите каноническую строку подключения и вызовите GetHashCode для этой строки. В этом случае вы можете определить «Provider = Microsoft.ACE.OLEDB.12.0; Data Source = path» как свою каноническую форму, а затем вам нужно будет преобразовать все эквивалентные строки подключения в каноническую строку, а затем вызвать GetHashCode.
Тогда возникает вопрос: насколько сложно превратить все эквивалентные строки подключения в одну и ту же строку?
Очень сложно, если не невозможно, определить, равны ли строки подключения. Единственное предположение, которое вы можете сделать, это то, что если строки равны, то и строки подключения равны.
Например - «.» может быть равно "localhost". Или localhost может иметь запись в файле hosts, переопределяющую его. Для некоторых будущих версий платформы может потребоваться символ ";" в конце строки ... две версии драйвера могут быть функционально эквивалентными, но вы относитесь к ним по-разному ... когда вы проводите линию, это очень нестабильный вопрос.
Моя точка зрения: Если вы не используете класс, который определяет каждый конкретный компонент строки подключения, вам не нужно решать, равны ли две строки подключения, помимо сравнения строк.
Я решил эту проблему на основе данных обоих ответов:
Определите каноническую строку подключения
И
Если вы не используете класс, который определяет каждый конкретный компонент строка подключения, у вас нет бизнес, решающий, есть ли два строки подключения равны, за пределами сравнивая строки.
Итак, я создал метод расширения для OleDbConnectionStringBuilder:
public static int GetRealHashCode(this OleDbConnectionStringBuilder target)
{
int ToReturn = 17;
ToReturn *= target.DataSource.TrimEnd(';').GetHashCode();
ToReturn *= target.Provider.TrimEnd(';').GetHashCode();
ToReturn *= target.PersistSecurityInfo.ToString().GetHashCode();
var OrderedKeys = from string key in target.Keys
orderby key
select key;
foreach (string Key in OrderedKeys)
ToReturn *= target[Key].GetHashCode();
return ToReturn;
}