1. 程式人生 > >Unity使用C#高階特性擴充套件方法

Unity使用C#高階特性擴充套件方法

C#擴充套件方法

最近在工作中遇到一個問題,即在不修改原始類的情況下,為類新增新的方法和屬性,於是在C#的高階特性中發現瞭解決方案:擴充套件方法

下面的擴充套件方法的定義:

             擴充套件方法有兩個限制:1 方法必須的定義在靜態類中(類中所有的擴充套件都是靜態的);2 所有擴充套件方法都需要使用this關鍵字對第一個引數(並且僅對第一個引數)進行修飾(用this限定的引數表示被擴充套件的項);下面的這個類中定義了兩個擴充套件方法:

using System;
using System.Reflection;
/// <summary>
/// C#高階特性擴充套件方法學習
/// </summary>
public static class Sample {
    // 本方法任何物件顯示它所處的程式集//
    public static void DisplayDefiningAssembly(this object obj) {
       Debug.Log(obj.GetType().Name + "lives here: => " +Assembly.GetAssembly(obj.GetType()).GetName().Name);
    }
    // 本方法允許任何整形返回倒置的副本,例56返回65//
    public static int ReverseDigits(this int i) {
        //把int翻譯成string然後獲取所有的字串 //
        char[] digts = i.ToString().ToCharArray();
        
        //反轉陣列的項//
        Array.Reverse(digts);
        // 放回string//
        string newDigts = new string(digts);
        //使用int值返回修改後的字串//
        return int.Parse(newDigts);
    }
}




每個擴充套件方法的第一個引數型別前都使用了關鍵字this,大多數情況下擴充套件方法的第一個引數表示被擴充套件的型別

DisplayDefiningAssembly()被定義為用於擴充套件System.Object,所以這個程式集中所有的物件都是使用這個擴充套件方法,Reverse()方法只被定義用作整數型別,

下面的具體的呼叫:

public class ExtensionMethod : MonoBehaviour {
    
    void Start() {
        int myInt = 1234567;
        myInt.DisplayDefiningAssembly();
        string myString = "I'm a string";
        myString.DisplayDefiningAssembly();
        //使用int的新功能//
        Debug.Log("Value of myInt:" + myInt.ToString());
        Debug.Log("Reverse digts of myInt: " + myInt.ReverseDigits());
    }
}