.net에서 재미있는 확장 방법(Extension Method)

6991 단어 method
ASP를 보고 있습니다.net MVC 코드에서 다음과 같은 호출이 발견되었습니다.
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

여기서 routes는 RouteCollection 클래스이고 RouteCollection 클래스에는 MapRoute 방법이 없습니다. MapRoute 방법은 RouteCollectionExtensions 클래스의 방법입니다. 메타데이터에서 얻은 RouteCollectionExtensions의 설명은 다음과 같습니다.
    public static class RouteCollectionExtensions
{
public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values);
public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values);
public static void IgnoreRoute(this RouteCollection routes, string url);
public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
}

이런 종류는 표면적으로 보면 독립된 종류로 다른 종류에서 계승된 것이 아니라 어떤 Interface도 실현되지 않았지만 주의해서 보면 다음과 같다.
  • 우선 이것은static류이고 그 방법도 모두static
  • 이다.
  • 사실 그것의 각 방법의 첫 번째 매개 변수는'this Route Collection'이고 유형 앞에'this'
  • 가 붙었다.
    이것은 무엇을 의미하는가?사실 이게 바로.net의 흥미로운 용법은 바로 하나의 종류를 확장하는 방법이지만 이 종류의 코드를 직접 수정하지 않는다는 것이다. 다음은 간단한 예가 있다.
        class Hello
    {
    private string m_strHello = "Hello";
    public string String { get { return m_strHello; } set { m_strHello = value; } }
    }

    static class HelloExtensions
    {
    public static void AppendWorld(this Hello hello)
    {
    hello.String += " World";
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Hello hello = new Hello();
    hello.AppendWorld();
    Console.WriteLine(hello.String);
    }
    }

    'Append World'라는 방법은 마치'Hello'같은 종류에 속하는 것처럼 보인다.
    이렇게 하면 약간의 제한이 있다. 그것은 클래스의 봉인을 깨뜨릴 수 없다는 것이다. 확장 방법은 확장할 클래스의public 구성원만 방문할 수 있고 다른 구성원들은 움직일 수 없다.

    좋은 웹페이지 즐겨찾기