1

如何通过将扩展方法替换为等效的 .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

4 回答 4

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 编译器在幕后所做的。Extensions顺便说一句,您也可以删除后缀。例如Helper,用于不迷惑人。

于 2012-05-02T08:54:38.517 回答
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 /

于 2012-05-02T08:55:01.947 回答
1

如果您不想使用扩展方法并避免代码中的歧义,那么最直接的解决方案是移动接口定义中ServiceLocatorExtenstions的所有方法IServiceLocator并删除ServiceLocatorExtenstions类。

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

于 2012-05-02T08:59:09.527 回答
1

为什么不将泛型方法放在您的界面中(以及)?由于您的扩展方法只会使调用更容易,所以首先让它更容易不是更好吗?

在 .NET 2.0 中有多种扩展方法:请参见此处此处

于 2012-05-02T08:59:37.677 回答