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 に答える