2016-08-05 10 views
0

I-Code habe wie untenBoxen und Unboxing Generika mit Guss Schnittstelle

public interface IFoo 
{ 
    int One { get; set; } 

    string Two { get; set; } 
} 

public class Foo : IFoo 
{ 
    public int One { get; set; } 
    public string Two { get; set; } 
} 

public class SomeDto<T> 
    where T : IFoo 
{ 
    public T Fik { get; set; } 

    public string Faj { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fik = new SomeDto<Foo>() { Fik = new Foo() { One = 1, Two = "ss" }, Faj = "ss" }; 

     var obj = (Object)fik; 

     // the problematic part 
     //======================= 
     var fikl = fik as SomeDto<IFoo>; //do something like that 
              //or 
     var fikl = (SomeDto<IFoo>)fik; //do something like that 
    } 
} 

Wie kann ich um diesen problematischen Teil arbeiten. Machen Sie etwas Ähnliches, um das Entpacken einer generischen Klasse zu ermöglichen, aber etwas allgemeineres wie die Schnittstelle.

Ich brauche das, weil ich Combobox mit Datenquelle auf Generika bauen. Und ich muss ein Element in der Liste finden, wobei einige Eigenschaften einen allgemeinen Wert bilden.

+0

Würden Sie erwarten Fik in SomeDto, nun auch eine Schnittstelle von IFoo:

interface IFoo { int Int { get; set; } } class Foo : IFoo { public int Int { get; set; } } interface IDto<out T> where T : IFoo { T Obj { get; } } class Dto<T> : IDto<T> where T : IFoo { public T Obj { get; set; } } 

, so dass Sie IDto<Foo> zu IDto<IFoo> so zuweisen? Das kannst du nicht tun. – Dispersia

+0

Nur um Sie wissen zu lassen - die Begriffe Boxen und Unboxing beziehen sich auf ganz andere Dinge. – Stilgar

Antwort

-1

Die kurze Antwort ist, dass Sie generische Schnittstellen verwenden müssen. Unten ist ein Beispiel. Hier ist die MSDN-Link für generische Schnittstellen: https://msdn.microsoft.com/en-us/library/kwtft8ak.aspx?f=255&MSPPError=-2147217396

public interface IFoo<T> 
{ 
    int One { get; set; } 
    T mrT { get; set; } 
} 

public class DejaFoo<T> : IFoo<T> 
{ 
    public int One { get; set; } 
    public T mrT { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var FooFoo = new DejaFoo<string>() { One = 1, mrT = "B. A. Baracus" }; 
     var boxed = (object) FooFoo; 

     var unboxed1 = (DejaFoo<string>) boxed; 
     Console.Write(unboxed1.mrT); 

     var unboxed2 = boxed as DejaFoo<string>; 
     Console.WriteLine(" is #{0}", unboxed2.One); 
    } 
} 

Der obige Code ausgeben sollte:

B. A. Baracus is #1 
+0

Lesen Sie Ihren Code, er weist dem Objekt nur einen Typ zu und kehrt zum selben Typ zurück, der nicht zu viel Sinn und Wert ergibt. –

+0

Warum wird IFoo plötzlich generisch? Es muss nicht. –

3

1) Es gibt nichts über Boxen/Unboxing

2) Sie können das nicht tun, weil und SomeDto<Foo> invariant zueinander sind. Das heißt, auch wenn "IFoo zuweisbar ist von Foo" kann nicht gesagt werden "SomeDto<IFoo> ist zuweisbar von SomeDto<Foo>" und umgekehrt.

Etwas ähnlich Ihren Absichten ist die Verwendung von kovariant/contravariant Generic Schnittstellen (weil nur Delegaten und Schnittstellen diesen Trick unterstützen). Zum Beispiel:

static void Main(string[] args) 
    { 
     Foo foo = new Foo(); 
     IDto<IFoo> dto = new Dto<IFoo>() {Obj = foo}; 
     object obj = dto; 
     dto = (IDto<Foo>) obj; 
    } 
+0

Kovariant in diesem Fall, nicht kontravariant. Es ist erwähnenswert, dass die Schnittstelle notwendig ist, da Klassen nicht gleichzeitig oder kontravariant sein können, sondern nur Schnittstellen und Delegierte. –

+0

@ThomasLevesque es ist nur ein Beispiel, weil ich nicht weiß, was der Autor braucht. Aber ich werde über die Notwendigkeit der Verwendung von Schnittstellen erwähnen, wenn es aus meiner Antwort nicht offensichtlich ist, danke. –

+0

Sorry für meinen Fehler mit meinem schlechten Verständnis der Boxen und Unboxing-Sache. Danke auch für die Antwort. Leider löst es mein Problem immer noch nicht. Ich wollte für die Schnittstelle (IFoo) umwandeln, weil ich die exakte Implementierung an diesem Ort nicht kannte. Ich weiß, dass das Objekt vom Typ IFoo ant ist, das ist alles. IFoo hat mehr als eine Implementierung. Am Ende habe ich dieses Problem gelöst, indem ich die Daten ändere, die ich in die Datenquelle für meine Combobox gelegt habe. Danke für alle Antworten. – user3333010