簡體   English   中英

在C#中為現有代碼添加自定義功能的最佳方法是什么?

[英]What's the best way to add custom functionality to existing code in C#?

比方說,我有很多Web應用程序使用在C#中編譯成dll的相同類庫,我想更新特定應用程序的類的特定方法。 我不想更改現有代碼,因為它會影響每個人,我不想從類繼承來創建新代碼。 我只想更改單個應用程序的類的現有方法。

實現此目的的一種方法是將編譯的類作為“基礎”類,並具有包含繼承基類的所有重寫類的單獨文件。 然后應用程序將使用繼承的類。 然后,要更改單個應用程序的類,您只需更新繼承的類。 我用這種方法看到的唯一問題是每個應用程序都需要2個文件,一個基類和一個繼承(可能沒有編譯)。

任何人都可以推薦更好的方法嗎?

也許擴展方法可行?

您無法更改已編譯方法的實現; 多態性是一種選擇; 另一種是封裝,可能是通過接口上的裝飾器模式,使用工廠來創建實例 - 即

interface IFoo { void Bar();}
class Foo : IFoo {public void Bar() { /* imp 1 */ } }
class FooWrapper : IFoo {
    IFoo parent;
    public FooWrapper(IFoo parent) {this. parent = parent;}
    public void Bar() { /* imp 2, perhaps using "parent" }
}

(我不會打擾多態的例子)

多態性和裝飾實現了類似的目的,但具有不同的優點/缺點 - 例如,裝飾器可以在靈活的鏈中組裝以用於不同的場景。

使用任何其他方法(例如擴展方法),您最終會調用另一種方法; 如果那適合,那很好。

如果您只是想在方法中添加內容而不修改其內容,則可以使用面向方面編程 (AOP)。 在C#中,可以使用PostSharpAspectDNG來完成。

AOP側重於關注點的分離:您編寫的方法只包含業務邏輯,應用程序的其他各個方面(安全性,日志記錄等)都封裝在自己的模塊中。 在編譯時,這些方面的代碼將被注入到您指定的特定位置的業務代碼中。

你也可以看看這個問題 即使問題專門針對方法的運行時修改,一些答案可能會給你一些提示。

我認為擴展方法是最好的選擇。 有關更多信息,請轉到此處

在不使用繼承類的情況下,您無法覆蓋現有方法,這似乎很奇怪。 這在javascript等語言中非常簡單。 以上建議給了我深思,但是我的初步想法確實改善了。 擴展方法不允許您修改現有方法。 使用封裝,我仍然需要使用新類。

假設我有10個應用程序都使用類user和方法login()。 我不想改變調用此方法的位置(即更改類名或方法參數)。 我只想更改該應用程序的方法本身,以便在返回之前進行額外的檢查。

是否可以在類庫Virtual中創建該方法? 這將允許您在您想要的地方覆蓋它,但另外保持“原樣”。

多態性似乎是最好的解決方案。 這樣就可以編譯基類並保持單獨使用,並且可以為各個應用程序更改繼承類,而無需更改原始使用方式(除非必要)。

BaseClasses.cs

public class BaseUser {

    public BaseUser() {}

    public bool login() {

        return false;

    }

}

Classes.cs

public class User : BaseUser {}

應用

User u = new User();
u.login(); 

擴展方法。 這應該添加到靜態類。 您應該訪問: http//weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx

DateTime類的擴展方法示例,使其返回周數:

public static int WeekNumber(this DateTime dtPassed)
    {
        CultureInfo ciCurr = CultureInfo.CurrentCulture;
        int weekNum = 0;
        try
        {
            weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed,
           CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday);
        }
        catch (Exception ex)
        {
            //TODO: Add error handling code
        }

        return weekNum;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM