2010-11-07 9 views
2

J'ai une interface écrite en C#, mais en l'implémentant en F #, j'ai remarqué quelques bizarreries.Erreurs de typage Réflexion/C# lors de la publication d'une classe F # implémentant une interface

  • Le F # classe doit être jeté à l'interface avant C# peut consommer
  • Après la coulée, WPF ne peut pas lire les propriétés est (Manchettes a échoué et SNOOP n'a pas pu y réfléchir)
  • I peut envelopper l'objet dans le code C# et tout fonctionne bien.

l'interface

public interface IInterpret { 
    public string Name {get;} 
    public IEnumberable<Project> Interpret(string text); 
} 

Le F # Classe

type Interpreter()= 
    interface IInterpret with 
    member x.Name = "FParsec Based" 
    member x.Interpret(str) = Seq.empty 

Le code ci-dessous pour ne compiler L'erreur est de ne pas mettre en œuvre l'interprète IInterpert

public ViewModel(){ 
    IInterpret i = new FSharpLib.Interperter(); 
} 

Voici ma solution actuelle

public class MyProxy: IInterpret{ 
    private IInterpret _cover; 

    public MyProxy()  { 
     _cover = new FSharpLib.Interperter() as IInterpret; 
    } 
    public string Name { get { return _cover.Name; } } 
    public IEnumerable<Project> Interpret(string text){ 
     return _cover.Interpret(text); 
    } 
} 

Y at-il quelque chose que je fais mal avec mon F # def classe, ou est le proxy nécessaire? J'utilise le VS2010 f # actuel, pas une goutte hors bande. F # implémente explicitement toutes les interfaces.

+0

FYI: new est facultatif sur les constructeurs F #, et est utilisé idiomatiquement uniquement avec les types implémentant IDisposable – pblasucci

Répondre

2

Cela signifie que vous devez convertir explicitement le type d'interface.

Je ne sais pas une tonne au sujet WPF liaison aux interfaces explicites, mais voir si ces

http://leecampbell.blogspot.com/2008/09/generic-binding-in-wpf-through-explicit.html

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/92a2a3ba-74a6-4c79-9c75-f42d232a4dbf

aide? (Je les trouvé Bing-ing pour « WPF contraignant interfaces explicites ».)

(Une autre alternative peut être faire quelque chose comme

type Interpreter()= 
    member x.Name = "FParsec Based" 
    member x.Interpret(str:string) = Seq.empty 
    interface IInterpret with 
     member x.Name = x.Name 
     member x.Interpret(str) = x.Interpret(str) 

où vous « mettre en œuvre explicitement l'interface implicitement », si vous pardonnez la terminologie prêtant à confusion.)

+0

Merci pour la compréhension. J'ai manqué le bit d'implémentation explicite et l'impact que cela peut avoir sur la liaison. – Ball