2016-05-29 3 views
0

Im Versuch, Legacy Windows GDI-Code in Xamarin zu verwenden, ohne den alten GDI-Code zu ändern (außer mit #if). In diesem speziellen Fall muss ich Color aus Xamrin.Forms verwenden, die in eine eigene Farbstruktur eingebettet sind. Ich bekomme den Fehler nicht umwandeln können, wie oben im Fragekopf angegeben.Wie fälschen eine Bibliothek (GDI zu Xamarin.Forms) über Namespaces und Plattformen wie Wiederverwendung von Color struct

Dies ist der Legacy-Code, der nicht modifiziert werden (oder sehr wenig) ist

#if WINDOWS 
using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.Data; 
using System.Windows.Forms; 
#else //if Xamarin 
using FakeGDI; //cannot specify 'using Xamarin.Forms;' in legacy class 

#endif 
namespace LegacyCode 
{ 
    public class MyClass 
    { 
     public MyClass() 
     { 
      Color x = Color.Yellow; //must not change legacy code 
     } 
    } 
} 

Dies ist der Code, das Vermächtnis GDI-Aufrufe zu Xamarin.Forms

using System; 
//cannot specify 'using Xamarin.Forms;' I want to fully qualify Xamarin.Forms as shown below 'Xamarin.Forms.Color.Yellow;' 

namespace FakeGDI 
{ 
    public struct Color 
    { 

     public static Color Yellow 
     { 
      get { 
       return Xamarin.Forms.Color.Yellow; 
       ;} 
     } 
    } 
} 

Die Lösung anzupassen Ich suche, um dies zu kompilieren und die Xamarin.Forms Color-Struktur über meine Color-Struktur indirekt zu verwenden.

Was ist erforderlich, um diese Art der Konvertierung zu ermöglichen?

Der Fehler ich erhalte, ist: Kann nicht implizit Typ Xamarin.Forms.Color' to FakeGDI.Color‘

Dank

+0

_ "nicht angeben‚Xamarin.Forms verwendet;‘ in der Legacy-Klasse "_ - Warum nicht? –

+0

Bitte nicht mit anderen Benutzern kollidieren und die gleiche Frage mehrmals wiederholen. Dies wird bei Stapelüberlauf als Rauschen angesehen. Wenn Ihre Frage als unbeantwortbar abgeschlossen wird oder keine Antworten anzieht, müssen Sie als Erstes die Frage * verbessern. Eine Anleitung dazu ist [hier gegeben] (http://stackoverflow.com/help/how-to-ask). Fragen mit niedriger Qualität oder nicht beantworteter Fragen werden in der Regel geschlossen, können aber erneut geöffnet werden, sofern sie verbessert oder geklärt sind (http://stackoverflow.com/questions/37505910/?noredirect=1). – Matt

Antwort

0

Es ist absolut nicht möglich, es zu tun in C# konvertieren.

Sie versuchen zu tun:

StructA a; 
StructB b; 
a = b; 

In kann nie funktionieren. Es wäre nur möglich, wenn Color eine Klasse wäre, dann könnte man Vererbung verwenden.

Die Einschränkung, die Sie nicht angeben können "mit Xamarin.Forms;" In der Legacy-Klasse gibt es keinen Weg dazu, denn im Gegensatz zu Sprachen wie JavaScript können Sie keinen Verweis auf eine Klasse, sondern nur auf ein Objekt kopieren.

Eine Lösung könnte jedoch das Schreiben der FakeGDI in einer anderen Sprache sein, die das Kopieren eines Verweises auf eine Klasse ermöglicht.

Es folgt ein Beispiel, wie man es in JavaScript macht, obwohl man es in JavaScript nicht wirklich machen kann, man muss nach einer dynamischen Sprache suchen, die seine Module als DLLs speichern kann.

module FakeGDI{ 
    var Xamarin = require('Xamarin.Forms.Color.Yellow'); 

    module.exports = { 
     Color : Xamarin.Forms.Color 
    }; 
} 
0

Ihr Code muss die statischen Eigenschaften des Elements so definieren, dass sie den richtigen Typ aufweisen. Mit anderen Worten:

namespace FakeGDI 
{ 
    public struct Color 
    { 
     public static Xamarin.Forms.Color Yellow 
     { 
      get { 
       return Xamarin.Forms.Color.Yellow; 
      } 
     } 
    } 
} 

Beachten Sie, dass die Xamarin.Forms Namespace auf die statische Eigenschaft angewendet wird, selbst.

+0

Danke Keith. Ich fügte es hinzu, um als 'öffentliches statisches Xamarin.Forms.Color Yellow' zu lesen, aber es kompilierte nicht und gab den gleichen Fehler. Hat es für dich kompiliert? –

+0

Nein, Ihr Beispielcode reicht nicht aus, um das Problem zu reproduzieren (ich habe keine Ahnung, in welchem ​​Kontext dieser Code ausgeführt werden soll). Wenn Sie Ihre minimalen Repro-Projekte in ein Github-Repository verschieben könnten, wäre es möglicherweise möglich, besser zu helfen. –

0

Die Ausnahme, die Sie sehen, ist, weil der Rückgabetyp Ihrer statischen Eigenschaft FakeGDI.Color.Yellow FakeGDI.Color ist, aber Sie eine Instanz von Xamarin.Forms.Color zurückgeben.

Zunächst möchten Sie, dass Ihre statischen Eigenschaften eine Instanz Ihres Color-Typs zurückgeben, da dies der Farbtyp ist, auf den Ihr Legacy-Code verweisen soll. Sie möchten dann einen impliziten Operator definieren, der Ihren Farbtyp in den Xamarin Color-Typ umwandelt, wo immer Ihr Legacy-Code eine Xamarin.Forms.Color erwartet, aber mit Ihrer FakeGCI.Color geliefert wird.

Sie können Ihre Farbe geben Sie einen Wrapper für die Xamarin Farbe Art machen, wie folgt:

namespace FakeGDI 
{ 
    public struct Color 
    { 
     private Xamarin.Forms.Color xamarinColor; 

     public static Color Yellow 
     { 
      get 
      { 
       return new Color(Xamarin.Forms.Color.Yellow); 
      } 
     } 

     private Color(Xamarin.Forms.Color color) 
     { 
      this.xamarinColor = color; 
     } 

     public static implicit operator Xamarin.Forms.Color(Color color) 
     { 
      return color.xamarinColor; 
     } 

     // although serving no purpose in your snippet, your legacy code will 
     // likely need to cast from Xamarin Color to your Color type also 
     public static implicit operator Color(Xamarin.Forms.Color color) 
     { 
      return new Color(color); 
     } 
    } 
} 
+0

Jedi Meister bist du, und danke! – Anna

+0

@Anna froh zu helfen, dankbar sein, wenn Sie meine Antwort akzeptiert, wenn es Ihr Problem gelöst hat :) – jooshe

+0

tut dies die Verwendung meiner Color-Struktur mit Xamarin.Forms.Color beinhalten oder aufrufen Boxen und Unboxing? Gibt es nicht nur Werte unter meinen benannten Mitgliedern? Danke – Anna

Verwandte Themen