Я слышал о названии дженериков в .NET 2.0, но оно не использовалось в реальной разработке.
Недавно я испытал это во время разработки программы веб-сайта Blog Park.
Сценарии применения:
Прочтите соответствующие настройки почты в файле конфигурации посредством десериализации.
Пример файла конфигурации:
<Настройки конфигурации блога>
<Настройки почты>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</Настройки почты>
</Настройки конфигурации блога>
Описание функции:
Через файл конфигурации атрибут MailSettings экземпляра BlogConfigurationSettings получается посредством десериализации, а затем соответствующий MailSetting получается в соответствии с ключевым словом, например: MailSetting с именем ApproveEmail.
Определение MailSetting:
Настройка почты
[Сериализуемый]
общедоступный класс MailSetting
{
частная строка _name;
[XmlAttribute("Имя")]
общедоступная строка Имя
{
получить {вернуть _имя;
установить { _name = значение }
}
частная строка _smtpServer;
[XmlAttribute("SmtpServer")]
общедоступная строка SmtpServer
{
получить {вернуться _smtpServer}
установить {_smtpServer = значение};
}
частная строка _mailFrom;
[XmlAttribute("MailFrom")]
общедоступная строка MailFrom
{
получить {возврат _mailFrom;
установить { _mailFrom = значение};
}
частная строка _username;
[XmlAttribute("ИмяПользователя")]
общедоступная строка Имя пользователя
{
получить {вернуть _имя_пользователя};
установить { _username = значение }
}
частная строка _password;
[XmlAttribute("Пароль")]
общедоступная строка Пароль
{
получить {вернуть _пароль};
установить {_пароль = значение};
}
Открытый строковый ключ
{
получить {вернуть это.Имя};
}
}
Если мы не используем дженерики, мы можем реализовать их через массивы или классы коллекций.
Для массивов нам нужно определить это в BlogConfigurationSettings:
частный MailSetting [] __mailSettings;
[XmlArray("MailSettings")]
общедоступный MailSetting [] MailSettings
{
получить {вернуть это._mailSettings};
установить { this._mailSettings = значение };
}Нам также необходимо написать метод для перечисления элементов массива и возврата соответствующего MailSetting на основе ключевого слова.
Для классов коллекций вам необходимо определить это в BlogConfigurationSettings:
частная MailSettingCollection _mailSettings;
[XmlArray("MailSettings")]
общедоступная коллекция MailSettingColletion
{
получить {вернуть это._mailSettings};
установить { this._mailSettings = значение };
} Нам нужно написать класс MailSettingCollection и реализовать метод в MailSettingCollection, чтобы найти соответствующий MailSetting на основе ключевых слов.
Для дженериков нам нужно только определить следующее в BlogConfigurationSettings:
частный список<MailSetting> _mailSettings;
[XmlArray("MailSettings")]
общедоступный список<MailSetting> MailSettings
{
получить {возврат _mailSettings;
установить { _mailSettings = значение;}
}
Тогда только следующая строка кода может получить соответствующий MailSetting на основе ключевого слова:
BlogConfigurationSettings.MailSettings.Find(delegate(MailSetting mailSetting) { return mailSetting.Key == "ApproveEmail"; })
Тип параметра метода Find — Predicate<T>, а его определение:
публичный делегат bool Predicate<T>(T obj)
То есть тип делегата, параметры которого являются универсальными и возвращаемое значение которого — bool.
Функция Find заключается в перечислении элементов в List<T> и вызове делегата с каждым элементом в качестве параметра делегата. Фактический метод делегата передается через параметр Find. Когда вызываемый делегат возвращает true, текущий элемент — это. вернулся.
Вы также можете написать код в параметре Find выше как отдельный метод, а затем использовать имя метода в качестве параметра Find.
Настройки конфигурации блога. MailSettings. Найти (IsMe);
public bool IsMe (MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
Вам сразу станет некомфортно с таким кодом. Почему бы не написать метод для каждого ключевого слова? Вы думаете, это должно быть написано так:
public bool IsMe (MailSetting mailSetting, строковый ключ)
{
вернуть mailSetting.Key == ключ;
}
Конечно, это хорошо, но Find не согласен. Его параметрами могут быть только методы с одним параметром.
Так как решить эту проблему?
Решение, о котором я подумал, заключалось в написании класса MailSettingPredicate:
общедоступный класс MailSettingPredicate
{
ключ частной строки;
ключ публичной строки
;
{
получить {ключ возврата};
установить {ключ = значение}
}
Public bool IsMe (MailSetting mailSetting)
{
вернуть mailSetting.Key == this.key;
}
}
Прежде чем вызывать IsMe, сначала установите значение MailSettingManager.Key. Код выглядит следующим образом:
Предикат MailSettingPredicate = новый MailSettingPredicate ();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "ContactEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
Я только что использовал дженерики .NET 2.0 в реальной разработке. Я пишу эту статью, чтобы углубить свое понимание. Я также надеюсь предоставить некоторую информацию для друзей, которые не знакомы с дженериками .NET 2.0. Вы можете указать на любые недостатки.