Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在C#中,向现有代码添加自定义功能的最佳方法是什么?_C#_Inheritance - Fatal编程技术网

什么';在C#中,向现有代码添加自定义功能的最佳方法是什么?

什么';在C#中,向现有代码添加自定义功能的最佳方法是什么?,c#,inheritance,C#,Inheritance,比如说,我有许多web应用程序使用相同的类库在C#中编译成dll,我想为特定的应用程序更新类的特定方法。我不想更改现有代码,因为它会影响所有人,我也不想从类继承来创建新的代码。我只想为单个应用程序更改类的现有方法 实现这一点的一种方法是将编译后的类作为“基类”,并有一个单独的文件,其中包含继承基类的所有重写类。然后应用程序将使用继承的类。然后,要更改单个应用程序的类,只需更新继承的类即可。我看到这个方法的唯一问题是每个应用程序都需要2个文件,一个是基类,另一个是继承的(可能没有编译) 有人能推荐

比如说,我有许多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" }
}
(我不想为多态性的例子费心)

多态性和装饰实现了相似的目的,但有不同的优点/缺点-例如,装饰器可以在不同的场景中以灵活的链组装


对于任何其他方法(如扩展方法),最终都会调用不同的方法;如果合适的话,那就好。

如果不使用继承的类,就不能重写现有的方法,这似乎很奇怪。这在javascript等语言中非常简单。以上的建议让我深思熟虑,但我的最初想法确实有所改进。扩展方法不允许修改现有方法。对于封装,我仍然需要使用一个新类


假设我有10个应用程序都使用类User with方法login()。我不想更改调用此方法的位置(即更改类名或方法参数)。我只想更改该应用程序的方法本身,以便在返回之前可以进行其他检查。

是否可以使类库中的方法成为虚拟的?这将允许您在需要的地方覆盖它,但在其他情况下保持“原样”。

如果您只是想在方法中添加内容,而不是修改其内容,则可以使用(AOP)。在C#中,这可以使用或来完成

AOP侧重于关注点的分离:您编写的方法只包含业务逻辑,应用程序的所有其他方面(安全性、日志记录等)都封装在它们自己的模块中。在编译时,这些方面的代码被注入到您指定的特定位置的业务代码中


你也可以看看。尽管这个问题专门针对方法的运行时修改,但一些答案可能会给您一些提示。

多态性似乎是最好的解决方案。通过这种方式,基类可以被编译并保持独立,而继承的类可以为单个应用程序更改,而无需更改原始类的使用方式(除非必要)

BaseClasses.cs

public class BaseUser {

    public BaseUser() {}

    public bool login() {

        return false;

    }

}
public class User : BaseUser {}
类.cs

public class BaseUser {

    public BaseUser() {}

    public bool login() {

        return false;

    }

}
public class User : BaseUser {}
应用

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

扩展方法。这应该添加到静态类中。你应浏览:

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;
    }

扩展方法只允许向类添加新方法,而不允许重写现有方法。这很有趣,但不是我想要的。部分原因是,当你来更改库类时,你可以看到你是否会破坏任何东西,而不必进入每个应用程序并检查修改。抽象/虚拟的内容越多,对库的更改就越困难。扩展方法有助于向现有类添加新方法,但这不适合我的场景,谢谢。