.NET 2.0相当于C#扩展方法

时间:2012-05-02 08:52:10

标签: c# oop design-patterns

如何通过将扩展方法替换为等效的.NET 2.0来将此代码更改为.NET 2.0兼容?

public interface IMessagingService {
    void sendMessage(object msg);
}
public interface IServiceLocator {
    object GetService(Type serviceType);
}
public static class ServiceLocatorExtenstions {
    //.NET 3.5 or later extension method, .NET 2 or earlier doesn't like it
    public static T GetService<T>(this IServiceLocator loc) {
        return (T)loc.GetService(typeof(T));
    }
}
public class MessagingServiceX : IMessagingService {
    public void sendMessage(object msg) {
        // do something
    }
}
public class ServiceLocatorY : IServiceLocator {
    public object GetService(Type serviceType) {
        return null; // do something
    }
}
public class NotificationSystem {
    private IMessagingService svc;
    public NotificationSystem(IServiceLocator loc) {
        svc = loc.GetService<IMessagingService>();
    }
}
public class MainClass {
    public void DoWork() {
        var sly = new ServiceLocatorY();
        var ntf = new NotificationSystem(sly);
    }
}

非常感谢。

4 个答案:

答案 0 :(得分:6)

只需从扩展程序中删除this关键字。

public static class ServiceLocatorExtensions
{    
    public static T GetService<T>(IServiceLocator loc) {
        return (T)loc.GetService(typeof(T));
    }
}

通过传递您正在“扩展”的对象实例,将其称为任何其他静态方法:

IServiceLocator loc = GetServiceLocator();
Foo foo = ServiceLocatorExtensions.GetService<Foo>(loc);

实际上这就是.Net 3.5编译器在幕后做的事情。 Btw后缀Extensions你也可以删除。例如。使用Helper不要混淆人。

答案 1 :(得分:2)

svc = loc.GetService<IMessagingService>();

等于

svc = ServiceLocatorExtenstions.GetService<IMessagingService>(loc);

但是,您不必删除扩展方法并仍然以.NET 2.0为目标 - 请查看此帖子(更多关于Google):http://kohari.org/2008/04/04/extension-methods-in-net-20/

答案 2 :(得分:1)

如果您不想使用扩展方法并避免代码含糊不清,那么最苛刻的解决方案是将所有ServiceLocatorExtenstions方法移到IServiceLocator接口定义中并移除ServiceLocatorExtenstions

但是,这个可能会涉及更多的工作,然后在这里提供其他解决方案,顺便说一句,这将产生更一致的结果。

答案 3 :(得分:1)

为什么不将通用方法放在你的界面中呢?由于您的扩展方法只会使调用更容易,因此首先让它变得更容易是不是更好?

在.NET 2.0中有一些扩展方法:请参阅herehere