2011-01-10 4 views
4

Ich möchte Compiler Fehler lokal Methoden verursachen, die geändert werden müssen, sobald ich den Übergang zu .NET Framework 4.0. Siehe unten:Wie mache ich meinen Code zu brechen, wenn der Übergang zu .NET Framework 4.0

Ups, während dies nur ein Beispiel ist, funktioniert dieser Code überhaupt nicht, etwas, das ich gerade realisiert habe. (Eine korrigierte Version ist am Ende zur Verfügung, wenn Sie jemals diese Art von Funktionalität benötigen)

// ASP.NET 3.5 does not contain a global accessor for routing data 
// this workaround will be used until we transition to .NET 4.0 

// this field still exists in .NET 4.0, however, it is never used 
// GetRouteData will always return null after the transition to .NET 4.0 

static object _requestDataKey = typeof(UrlRoutingModule) 
    .GetField("_requestDataKey", BindingFlags.NonPublic | BindingFlags.Instance) 
    .GetValue(null) 
    ; 

public static RouteData GetRouteData(this HttpContext context) 
{ 
    if (context != null) 
    { 
     return context.Items[_requestDataKey] as RouteData; 
    } 
    // .NET 4.0 equivalent 
    //if ((context != null) && (context.Request != null)) 
    //{ 
    // return context.Request.RequestContext.RouteData; 
    //} 
    return null; 
} 

Kennt jemand einen Trick, der in einem Compiler-Fehler führt, wenn der Übergang gemacht wird?

Dieser Code entspricht tatsächlich der ursprünglichen Version. Dieser Code ist auch nicht spezifisch für die Version 3.5 der Laufzeit, es gibt jedoch einfachere Möglichkeiten, um die Routendaten in 4.0 zu erhalten.

if (context != null) 
{ 
    var routeData = context.Items["RouteData"] as RouteData; 
    if (routeData == null 
     && !context.Items.Contains("RouteData")) 
    { 
     context.Items["RouteData"] = routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(context)); 
    } 
    return routeData; 
} 

Antwort

4

Ich denke, es gibt kein eingebautes in Präprozessorsymbol, aber man konnte Ihre eigene Rolle:

public static RouteData GetRouteData(this HttpContext context) 
{ 
    if (context != null)  
    {   
     return context.Items[_requestDataKey] as RouteData;  
    } 
#if NET_4 
#error Review code for .NET 
#endif 

    // .NET 4.0 equivalent  
    //if ((context != null) && (context.Request != null))  
    //{  
    // return context.Request.RequestContext.RouteData;  
    //}  
    return null; 
} 

Dann, wenn Sie Ihre Projekte für 4 .NET kompilieren, fügen Sie das „NET_4“ Symbol der Compiler Symbole (über VS.NET-Projekteigenschaften oder direkt in der .csproj-Datei).

Natürlich erfordert dies, dass Sie wissen, die Orte von Interesse (d. H. Via Code Überprüfung). Ich denke, es gibt keine Möglichkeit, das automatisch passieren zu lassen.

+0

Oh, ein Fehler Präprozessor Anweisung, schön, ich wusste nicht, dass es einen gab. Das wird funktionieren, ich muss nur das Symbol definieren, wenn ich mit dem neuen Framework kompiliere, und diese Fehler sollten auftauchen. Danke @ Christian.K –

1

könnten Sie verwenden das Obsolete Attribut auf die Methode in Frage

[Obsolete("Upgrade Method to .NET 4.0", true)] 

Der boolean am Ende gibt an, dass der Compiler einen Fehler erzeugen sollte wenn dieses Verfahren verwendet wird. Daher könnten Sie in Ihrem Fall false hier übergeben und eine Warnung generieren lassen, so dass Ihr Programm noch funktioniert, aber Feedback gibt, dass Sie die Methode aktualisieren müssen.

2

Verwenden Sie Environment.Version.

Ruft ein Version-Objekt ab, das die Haupt-, Neben-, Build- und Revisionsnummern der Common Language Runtime beschreibt.

Sie können in Ihrer Methode verwenden, diese Fehler zu drucken, werfen Ausnahmen etc ...

+0

+1, ich mag diese Lösung, da der Code abwärtskompatibel sein kann. In seinen Fragen steht jedoch, dass er zur Kompilierzeit etwas benötigt? –

+0

@ Moo-Juice - Ich weiß, wonach er gefragt hat, aber denke, das ist eine bessere Option. Wenn dies in die Initialisierung der Anwendung eingefügt wird, kann es dazu gebracht werden, überhaupt nicht zu laufen. – Oded

+0

Eigentlich benötige ich keine Kompilierungszeit, aber wenn es eine Möglichkeit gibt, dies durch statische Verifikation zu tun, warum nicht? Die Probleme, die ich mit Laufzeitüberprüfung habe, ist, dass es nur Laufzeitprüfung ist. Du musst es ausführen, um es herauszufinden. Das erfordert eine Menge Tests, die sowieso nicht schlecht sind, aber nichts, wovor ich noch viel Zeit habe. –

1

Sie bedingte Kompilierung verwenden könnte das Ergebnis, aber nicht die Methode zu erreichen, dass Sie nach. Wenn Sie this answer sehen, wird die Einstellung bedingter Werte beschrieben. Definieren Sie eine für Targeting von .NET 3.5 und wickeln Sie den alten Code darin ein. Wickeln Sie den neuen Code in ein IFNDEF oder etwas ähnliches ein. Ich habe selbst keine bedingte Kompilation verwendet, aber das ist der Winkel, an den ich zuerst gedacht habe.

1

Nun, Laufzeitfehler sind einfach zu erstellen, aber Kompilierzeit Fehler ein wenig komplizierter. Möchten Sie zuerst eine neue .NET Framework-Version oder eine neue Compiler-Version erkennen? Ich kenne keine Möglichkeit, Unterschiede in der Laufzeitversion zur Kompilierzeit zu erkennen.

Es gibt jedoch eine Möglichkeit, einen Fehler beim Kompilieren mit dem Visual Studio 2010-Compiler auszulösen (im Gegensatz zur Version 2008).Werfen wir einen Blick auf die Liste der C# 2010-Breaking-Changes unter http://msdn.microsoft.com/en-us/library/ee855831(VS.100).aspx.

Der Unterschied im Null-Koaleszenz-Operator-Verhalten in Bezug auf nicht initialisierte lokale Variablen scheint ein guter Kandidat dafür zu sein.

#pragma warning disable 0219 
bool? i; 
bool? j; 
// TODO: Update this method for .NET 4 and remove this section. 
bool? createCompilerErrorOnVS2010 = (i = true) ?? j; 
#pragma warning restore 0219 

Der obige Code wird mit dem Visual Studio 2008-Compiler aber nicht mit dem Visual Studio 2010-Compiler kompiliert.

+0

Ordentlich, wir verwenden die Werkzeuge 4.0, aber immer noch auf dem 3.5-Framework. Der 4.0-Compiler wird leider verwendet. Cooler Trick. –

Verwandte Themen