2016-02-03 2 views
0

J'ai créé un service WCF avec une méthode simple avec une propriété de type 'object' car cette propriété est destinée à être utilisée avec différents types d'objets, mais quand je lance la propriété à un autre type lève une exception invalidCastException. Le service ressemble à ceci:cast la propriété de type 'object' à knownType dans le client wcf

[ServiceContract] 
[ServiceKnownType(typeof(List<ItemDataContract>))] 
public interface IService 
{ 
    [OperationContract] 
    ItemContainer GetList(); 
} 

[DataContract] 
[KnownType(typeof(List<ItemDataContract>))] 
public class ItemContainer 
{ 
    [DataMember] 
    public object Data { get; set; } 
} 

[DataContract] 
public class ItemDataContract 
{ 
    [DataMember] 
    public string Id { get; set; } 
} 

et la mise en œuvre de la méthode:

public ItemContainer GetList() 
{ 
    return new ItemContainer 
    { 
     Data = new List<ItemDataContract> {new ItemDataContract{ Id = "1"}, new ItemDataContract{Id = "2"} 
    }; 
} 

Du côté du client que j'ai l'appel à la méthode:

Service1 _proxy = new Service1(); 
var result = _proxy.GetList(); 
return (List<ItemDataContract>)result.Data; 

le problème est que je reçois une exception de transtypage invalide du côté du client parce que le résultat. En interne, il est de type 'objet' au lieu d'être une liste, même s'il utilise le type serviceNom et le type connu.

Comment rendre cette distribution possible?

+0

Est-ce une option pour rendre ItemContainer générique et il suffit de spécifier le type par opération? – Mark

+0

oui Marquer, mais alors dans l'implémentation vous auriez un différent ItemContainer par type d'objet que vous voulez utiliser, résultant en un type différent pour chacun de ceci dans la référence de service du côté du client. –

+0

Eh bien ce serait ma préférence personnelle de toute façon parce que sinon le client aurait besoin de connaître le détail de l'implémentation exacte du service afin de faire la distribution correcte. En ce qui concerne le problème en question, vous pouvez essayer (aucune idée si cela fonctionnera) de placer les données et les contrats de service dans un assembly référencé par le client et le service. Lorsque vous importez la référence de service, celle-ci fait référence à celles de l'assembly partagé. Peut-être que la distribution fonctionnera alors. Sinon, il n'y a probablement pas assez d'informations de type pour que l'exécution sache qu'elles sont de la même classe. – Mark

Répondre

0

Cela prenait trop de temps pour essayer casting type d'objet, donc je fini par créer une nouvelle classe appelée données, à partir de laquelle toutes les autres classes que j'avais dans l'interface IService1 ont hérité, et assigné ce type pour la propriété Data. Pour les types énumérables, j'ai créé une propriété spécifiquement pour chacun des types de classe Data. Im sure n'est pas la meilleure réponse mais cela fonctionne en utilisant les types connus avec le ItemContainer.

0

Vous devriez essayer cela, j'espère que cela vous aidera ......

Service1 _proxy = new Service1(); 
    List<ItemContainer> result = _proxy.GetList(); 
    return result.Data.ToList<datatype>(); 
+0

essayé mais n'a pas fonctionné, C# ne permet pas au type d'objet d'utiliser la méthode ToList –

+0

Vous utilisez var tahts pourquoi vous ne pouvez pas utiliser la méthode Tolist –