2012-05-02 106 views
0

如何通過將擴展方法替換爲等效的.NET 2.0來將這段代碼更改爲與.NET 2.0兼容?.NET 2.0等效的C#擴展方法

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

非常感謝。

+0

爲什麼你必須使用擴展方法?將擴展類用作IServiceLocator上的函數提供者。 – SimpleVar

回答

5

只需從擴展方法中刪除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

如果你不您不希望使用擴展方法並避免代碼中出現歧義,因此解決方案是將您的IServiceLocator接口定義中的所有ServiceLocatorExtenstions方法移除,並刪除ServiceLocatorExtenstions類。

但是,這個可能會涉及更多的工作,然後在這裏其他解決方案,這樣會產生更一致的結果。

1

爲什麼不把通用方法放在你的界面中(以及)?由於您的擴展方法只能使調用變得更加簡單,首先讓它變得更容易不是更好嗎?

在.NET 2.0中有擴展方法的方法:請參閱herehere