擴充(Extension)應用時機及案例

  • 677
  • 0

string下有無數難理解的extension, 使用時機及管理?
使用時機
1. class裡的method可用extension method替代, 但只限於對class沒有控制權無法調整, 才用extension
2. static method可用extension method替代
3. 儘量保持簡單, 若有相依性問題, 需要傳參數, 建議另開class或factory處理
4. 注意不要影響IntelliSense
internal class Example
{
	//class method
	public string GetFunctionType() { return "Class method"; }
}

string result = new Example().GetFunctionType();
//result=="Class method"

//class method功能可用extension method替代
internal static class Extension
{
	//extension method
	public static string GetFunctionType(this Example example) 
	{
		return $"Extension method";
	}
	
	public static string GetFunctionType(this Example example, int myNum) 
	{
		return $"Extension method: {myNum}";
	}
}
使用注意: extension無法override, 因此得到class method的return
[Test]
public void ExtensionFunction_Overriding_OK()
{
	Example example = new Example();
	string result = example.GetFunctionType();
	Assert.IsTrue(result.Contains("Class"));    //pass
}
使用注意: extension可做到overloading
[Test]
public void ExtensionFunction_Overloading_OK()
{
	int myNum = 123;
	Example example = new Example();
	string result = example.GetFunctionType(myNum);
	Assert.IsTrue(result.Contains(myNum.ToString()));    //pass
}
extension範例
//特定物件下有意義的功能

public enum TypeEnum
{
    TypeA,
    TypeB,
    // etc.
}

public static class TypeEnumExt
{
    public static bool HasType(this TypeEnum item, TypeEnum queryEnum)
    {
      ...
    }
}
//取名要有意義
    public static class UserExtensionMethods
    {
        public static void NotifyToReset(this User profile)
        { }

        public static void NotifyTwoFactor(this User profile)
        {}

        public static void NotifyToActivate(this User profile)
        {}
    }
參考資料

1.When do you use extension methods, ext. methods vs. inheritance?

2.Extensions are resolved statically