zoukankan      html  css  js  c++  java
  • .NET 扩展方法

     

    • 扩展方法
         扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。
         通常,建议您只在不得已的情况下才实现扩展方法,并谨慎地实现。 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。
    • 限制条件
      • 必须定义在静态类中
      • 必须使用this关键字对第一个参数进行修饰
      • 每个扩展方法只能被内存中正确的实例和其所在的静态类调用
    • 代码示例
    namespace DefineIMyInterface
    {
        using System;
        public interface IMyInterface
        {
            void MethodB();
        }
    }
    namespace Extensions
    {
        using System;
        using DefineIMyInterface;
        public static class Extension
        {
            public static void MethodA(this IMyInterface myInterface, int i)
            {
                Console.WriteLine
                    ("Extension.MethodA(this IMyInterface myInterface, int i)");
            }
            public static void MethodA(this IMyInterface myInterface, string s)
            {
                Console.WriteLine
                    ("Extension.MethodA(this IMyInterface myInterface, string s)");
            }
            public static void MethodB(this IMyInterface myInterface)
            {
                Console.WriteLine
                    ("Extension.MethodB(this IMyInterface myInterface)");
            }
        }
    }
    namespace ExtensionMethodsDemo1
    {
        using System;
        using Extensions;
        using DefineIMyInterface;
        class A : IMyInterface
        {
            public void MethodB() { Console.WriteLine("A.MethodB()"); }
        }
        class B : IMyInterface
        {
            public void MethodB() { Console.WriteLine("B.MethodB()"); }
            public void MethodA(int i) { Console.WriteLine("B.MethodA(int i)"); }
        }
        class C : IMyInterface
        {
            public void MethodB() { Console.WriteLine("C.MethodB()"); }
            public void MethodA(object obj)
            {
                Console.WriteLine("C.MethodA(object obj)");
            }
        }
        class ExtMethodDemo
        {
            static void Main(string[] args)
            {
                A a = new A();
                B b = new B();
                C c = new C();
                a.MethodA(1);           // Extension.MethodA(object, int)
                a.MethodA("hello");     // Extension.MethodA(object, string)
                a.MethodB();            // A.MethodB()
                b.MethodA(1);           // B.MethodA(int)
                b.MethodB();            // B.MethodB()
                b.MethodA("hello");     // Extension.MethodA(object, string)
                c.MethodA(1);           // C.MethodA(object)
                c.MethodA("hello");     // C.MethodA(object)
                c.MethodB();            // C.MethodB()
            }
        }
    }
    
  • 相关阅读:
    6个laravel常用目录路径函数
    Laravel上传产品图片Uploading img
    Laravel删除产品-CRUD之delete(destroy)
    Laravel编辑产品-CRUD之edit和update
    Laravel展示产品-CRUD之show
    Laravel创建产品-CRUD之Create and Store
    内存泄露从入门到精通三部曲之排查方法篇
    P问题、NP问题、NPC问题、NP难问题的概念
    二维码的生成细节和原理
    一分钟认识GitHub
  • 原文地址:https://www.cnblogs.com/liusuqi/p/3125553.html
Copyright © 2011-2022 走看看