.NET 2.0에서 제네릭이라는 이름을 들어본 적은 있지만 실제 개발에서는 사용되지 않았습니다.
최근 블로그파크 홈페이지 프로그램을 개발하면서 이런 일을 경험했습니다.
애플리케이션 시나리오:
역직렬화를 통해 구성 파일의 해당 메일 설정을 읽습니다.
구성 파일 예:
<블로그 구성 설정>
<메일 설정>
<MailSetting Name="ApproveEmail" SmtpServer="smtp.126.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
<MailSetting Name="ContactEmail" SmtpServer="smtp.163.com" EmailFrom="" UserName="" PassWord=""></MailSetting>
</MailSettings>
</BlogConfigurationSettings>
기능 설명:
구성 파일을 통해 BlogConfigurationSettings 인스턴스의 MailSettings 속성은 역직렬화를 통해 얻은 다음 키워드에 따라 해당 MailSetting을 얻습니다(예: ApproveEmail이라는 MailSetting).
메일 설정 정의:
메일설정
[직렬화 가능]
공개 클래스 MailSetting
{
개인 문자열 _name;
[XmlAttribute("이름")]
공개 문자열 이름
{
{반환_이름}을 얻습니다.
설정 { _name = 값 }
}
개인 문자열 _smtpServer;
[XmlAttribute("Smtp서버")]
공개 문자열 SmtpServer
{
get { return _smtpServer };
설정 { _smtpServer = 값 }
}
비공개 문자열 _mailFrom;
[XmlAttribute("MailFrom")]
공개 문자열 MailFrom
{
{ return _mailFrom }을 얻습니다.
설정 { _mailFrom = 값 }
}
비공개 문자열 _username;
[XmlAttribute("사용자 이름")]
공개 문자열 사용자 이름
{
{return_username}을 얻습니다.
설정 { _username = 값 }
}
비공개 문자열 _password;
[XmlAttribute("비밀번호")]
공개 문자열 비밀번호
{
{반환_비밀번호}를 얻으세요;
설정 { _password = 값 }
}
공개 문자열 키
{
get { 반환 this.Name }
}
}
제네릭을 사용하지 않는 경우 배열이나 컬렉션 클래스를 통해 구현할 수 있습니다.
배열의 경우 BlogConfigurationSettings에서 이를 정의해야 합니다.
개인 메일 설정 [] __mailSettings;
[XmlArray("메일 설정")]
공개 MailSetting [] MailSettings
{
get { return this._mailSettings }
설정 { this._mailSettings = 값 }
}또한 배열 요소를 열거하고 키워드를 기반으로 해당 MailSetting을 반환하는 메서드를 작성해야 합니다.
컬렉션 클래스의 경우 BlogConfigurationSettings에서 이를 정의해야 합니다.
개인 MailSettingCollection _mailSettings;
[XmlArray("메일 설정")]
공개 MailSettingColletion MailSettings
{
get { return this._mailSettings }
설정 { this._mailSettings = 값 }
}MailSettingCollection 클래스를 작성하고 키워드를 기반으로 해당 MailSetting을 찾으려면 MailSettingCollection에 메서드를 구현해야 합니다.
제네릭의 경우 BlogConfigurationSettings에서 다음만 정의하면 됩니다.
개인 목록<MailSetting> _mailSettings;
[XmlArray("메일 설정")]
공개 목록<MailSetting> 메일 설정
{
{return _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>의 요소를 열거하고 각 요소를 대리자의 매개 변수로 사용하여 대리자를 호출하는 것입니다. 호출된 대리자가 true를 반환하면 실제 대리자 메서드는 다음과 같습니다. 돌아왔다.
위의 Find 매개변수에 별도의 메소드로 코드를 작성한 뒤 해당 메소드 이름을 Find의 매개변수로 사용할 수도 있습니다.
BlogConfigurationSettings.MailSettings.Find(IsMe);
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == "ApproveEmail";
}
이러한 코드를 사용하면 즉시 불편함을 느낄 것입니다. 각 키워드에 대해 다음과 같이 작성해야 한다고 생각하십니까?
public bool IsMe(MailSetting mailSetting, 문자열 키)
{
return mailSetting.Key == 키;
}
물론 이런 식으로 작성하는 것은 좋지만 Find는 이에 동의하지 않습니다. 해당 매개변수는 하나의 매개변수를 갖는 메서드만 허용됩니다.
그렇다면 이 문제를 해결하는 방법은 무엇입니까?
제가 생각한 해결책은 MailSettingPredicate 클래스를 작성하는 것이었습니다.
공개 클래스 MailSettingPredicate
{
개인 문자열 키;
공개 문자열 키
{
{반환 키}를 얻습니다.
설정 { 키 = 값 }
}
public bool IsMe(MailSetting mailSetting)
{
return mailSetting.Key == this.key;
}
}
IsMe를 호출하기 전에 먼저 MailSettingManager.Key의 값을 설정합니다. 코드는 다음과 같습니다.
MailSettingPredicate 조건자= new MailSettingPredicate();
predicate.Key = "ApproveEmail";
Config.Settings.MailSettings.Find(predicate.IsMe);
predicate.Key = "연락처이메일";
Config.Settings.MailSettings.Find(predicate.IsMe);
저는 실제 개발에서 .NET 2.0 제네릭을 사용했습니다. 또한 .NET 2.0 제네릭에 익숙하지 않은 친구들을 위해 몇 가지 참고 자료를 제공하고자 합니다.