2009-12-28 7 views
7

Ich erstelle einen expliziten Konvertierungsoperator, um zwischen einer generischen Liste von Entitätstypen in eine generische Liste von Modelltypen zu konvertieren. Weiß jemand, warum ich die folgende Fehlermeldung erhalten:Expliziter Konvertierungsoperatorfehler beim Konvertieren generischer Listen

User-defined conversion must convert to or from the enclosing type

Ich habe bereits einen expliziten Umwandlungsoperator zwischen Entity.objA und Model.objA der gut arbeitet. Das Problem tritt auf, wenn versucht wird, die generische Liste zu konvertieren. Ist das überhaupt möglich?

Hier ist mein Code:

public static explicit operator List<Model.objA>(List<Entity.objA> entities) 
    { 
     List<Model.objA> objs= new List<Model.objA>(); 
     foreach (Entity.objA entity in entities) 
     { 
      objs.Add((Model.objA)entity); 
     } 
     return claims; 
    } 

Vielen Dank für jede Hilfe.

Antwort

17

Der Fehler "Benutzerdefinierte Konvertierung muss in oder aus dem umschließenden Typ konvertieren" sagt genau, was es bedeutet. Wenn Sie einen Konvertierungsoperator

haben
class MyClass { 
    public static explicit operator xxx(string s) { // details } 
    public static implicit operator string(xxx x) { // details } 
} 

Dann muss xxxMyClass sein. Dies ist gemeint mit der "Konvertierung muss in oder von dem umschließenden Typ konvertiert werden". Der umschließende Typ ist hier MyClass.

Der entsprechende Abschnitt der # spec ECMA334 C 17.9.4:

A conversion operator converts from a source type, indicated by the parameter type of the conversion operator, to a target type, indicated by the return type of the conversion operator. A class or struct is permitted to declare a conversion from a source type S to a target type T only if all of the following are true, where S0 and T0 are the types that result from removing the trailing ? modifiers, if any, from S and T:

S0 and T0 are different types.

Either S0 or T0 is the class or struct type in which the operator declaration takes place.

Neither S0 nor T0 is an interface-type.

Excluding user-defined conversions, a conversion does not exist from S to T or from T to S.

hier ist also Ihr Code:

public static explicit operator List<Model.objA>(List<Entity.objA> entities) { 
    List<Model.objA> objs= new List<Model.objA>(); 
    foreach (Entity.objA entity in entities) { 
     objs.Add((Model.objA)entity); 
    } 
    return claims; 
} 

Das Problem ist, dass dies für sie als Konvertierungsoperator definiert werden muss sich in den Klassen List<Model.objA> oder List<Entity.objA> befinden, aber natürlich können Sie das nicht tun, da Sie keinen Zugriff darauf haben, diese Typen zu ändern.

Sie könnten Enumerable.Select verwenden, um auf den anderen Typ zu projizieren, oder . Zum Beispiel:

public static class ListExtensions { 
    public static List<Model.objA> ConvertToModel(this List<Entity.objA> entities) { 
     return entities.ConvertAll(e => (Model.objA)e); 
    } 
} 
2

Grundsätzlich können Sie dies nicht tun. In Ihrem Operator muss entweder der Eingabe- oder der Ausgabetyp von dem Typ sein, der den Operator deklariert. Eine Option könnte eine Erweiterungsmethode sein, aber um ehrlich zu sein, LINQ Select kommt ziemlich von selbst, ebenso wie List<T>.ConvertAll.

Als Beispiel für die Erweiterung Methode Ansatz:

public static class MyListUtils { 
    public static List<Model.objA> ToModel(this List<Entity.objA> entities) 
    { 
    return entities.ConvertAll(entity => (Model.objA)entity); 
    } 
} 

oder allgemeiner mit LINQ Select:

public static class MyListUtils { 
    public static IEnumerable<Model.objA> ToModel(
    this IEnumerable<Entity.objA> entities) 
    { 
    return entities.Select(entity => (Model.objA)entity); 
    } 
} 

und nur someList.ToModel() verwenden.

Verwandte Themen