C#.Net에서 프로토타입 메서드(예: JavaScript)를 어떻게 만들 수 있나요?
문제
C#.Net에서 프로토타입 메서드를 만드는 것이 어떻게 가능합니까?
JavaScript에서는 다음을 수행하여 문자열 개체에 대한 다듬기 메서드를 만들 수 있습니다.
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
C#.Net에서 이 작업을 어떻게 수행할 수 있나요?
해결책
해당 클래스의 소스를 변경하는 경우를 제외하고는 .NET의 기존 개체나 클래스에 메서드를 동적으로 추가할 수 없습니다.
그러나 C# 3.0에서는 확장 메서드를 사용할 수 있습니다. 바라보다 새로운 메소드와 비슷하지만 컴파일 타임의 마법입니다.
코드에 대해 이 작업을 수행하려면:
public static class StringExtensions
{
public static String trim(this String s)
{
return s.Trim();
}
}
그것을 사용하려면:
String s = " Test ";
s = s.trim();
이는 새로운 메서드처럼 보이지만 다음 코드와 정확히 동일한 방식으로 컴파일됩니다.
String s = " Test ";
s = StringExtensions.trim(s);
정확히 무엇을 성취하려고 하시나요?아마도 당신이 원하는 것을 하는 더 좋은 방법이 있을까요?
다른 팁
C#의 확장 메서드에 대해 이야기하는 것 같습니다.첫 번째 매개변수 앞에 "this" 키워드를 삽입하여 기존 클래스에 기능을 추가합니다.메서드는 정적 클래스의 정적 메서드여야 합니다..NET의 문자열에는 이미 "Trim" 메서드가 있으므로 다른 예를 사용하겠습니다.
public static class MyStringEtensions
{
public static bool ContainsMabster(this string s)
{
return s.Contains("Mabster");
}
}
이제 모든 문자열에는 다음과 같이 사용할 수 있는 매우 유용한 ContainsMabster 메서드가 있습니다.
if ("Why hello there, Mabster!".ContainsMabster()) { /* ... */ }
인터페이스(예: IList)에 확장 메서드를 추가할 수도 있습니다. 즉, 해당 인터페이스를 구현하는 모든 클래스도 새 메서드를 선택하게 됩니다.
확장 메서드에서 선언하는 추가 매개변수(첫 번째 "this" 매개변수 뒤)는 일반 매개변수로 처리됩니다.
.NET 3.5가 필요한 확장 메서드를 만들어야 합니다.메서드는 정적 클래스에서 정적이어야 합니다.메서드의 첫 번째 매개 변수에는 서명에서 "this"라는 접두사가 붙어야 합니다.
public static string MyMethod(this string input)
{
// do things
}
그런 다음 다음과 같이 호출할 수 있습니다.
"asdfas".MyMethod();
3.5 컴파일러를 사용하면 확장 방법을 사용할 수 있습니다.
public static void Trim(this string s)
{
// implementation
}
다음 해킹을 포함하여 CLR 2.0 대상 프로젝트(3.5 컴파일러)에서 이를 사용할 수 있습니다.
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
public sealed class ExtensionAttribute : Attribute
{
}
}