…

使用時機
1. class裡的method可用extension method替代, 但只限於對class沒有控制權無法調整, 才用extension
2. static method可用extension method替代
3. 儘量保持簡單, 若有相依性問題, 需要傳參數, 建議另開class或factory處理
4. 注意不要影響IntelliSenseinternal 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?