2013-05-23 1 views
2

J'ai actuellement une interface pour un composant COM qui est quelque chose comme ceci:Puis-je avoir auto-propriétés dans une interface COM

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("aa950e58-7c6e-4818-8fc9-adecbc7a8f14")] 
    public interface MyIObjects 
    { 
     void set_price(float rx); 
     void set_size(long rx); 

     float get_price(); 
     long get_size(); 
    } 

Maintenant, est-il un simple raccourci qui pourrait réduire deux lignes de ce qui suit à une ligne

  void set_price(float rx); 
      float get_price(); 

Je sais que dans les classes que je peux faire quelque chose comme ça

int Price { get; set; } 

mais sera THI s travailler dans une interface?

+0

Vous voulez dire une fonction Visual Studio/raccourci? –

+0

Oui une fonctionnalité de studio visuel ou une macro (mais C# n'a pas de macros) – MistyD

+0

Je pense que [Resharper] (http://www.jetbrains.com/resharper/webhelp50/Refactorings__Convert_Method_to_Property.html) a quelque chose dans ce sens, mais je peux Ne commente pas à coup sûr. –

Répondre

1

COM se soucie uniquement des interfaces, pas de leur implémentation. Vous déclarez déjà une propriété avec une syntaxe qui ressemble à une définition de propriété automatique.

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
public interface IMyObjects 
{ 
    float price { get; set; } 
    int size { get; set; } 
} 

La façon dont vous implémentez la propriété dépend entièrement de vous. Et oui, l'utilisation d'une auto-propriété dans la classe qui implémente l'interface est très bien.

[ComVisible(true), ClassInterface(ClassInterfaceType.None)] 
public class MyObjects : IMyObjects { 
    public float price { get; set; } 
    public int size { get; set; } 
} 

Notez que le type long tel qu'il apparaît dans les bibliothèques de type COM ou code natif est le même que le type int en C#.


Voici ce que la définition IDL de l'interface serait (en supposant l'intérieur de l'espace de noms CSDllCOMServer)

[ 
    odl, 
    uuid(AA950E58-7C6E-4818-8FC9-ADECBC7A8F14), 
    version(1.0), 
    oleautomation, 
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "CSDllCOMServer.MyIObjects") 

] 
interface MyIObjects : IUnknown { 
    [propget] 
    HRESULT _stdcall price([out, retval] single* pRetVal); 
    [propput] 
    HRESULT _stdcall price([in] single pRetVal); 
    [propget] 
    HRESULT _stdcall size([out, retval] long* pRetVal); 
    [propput] 
    HRESULT _stdcall size([in] long pRetVal); 
}; 
+0

Vous avez vraiment bien couvert ce que j'allais passer en revue dans ma réponse (vous venez de me battre dessus) J'ai ajouté dans la définition IDL de l'interface échantillon à votre réponse (j'allais mettre dans ma propre réponse). –

0

Vous pouvez très bien déclarer les propriétés dans les interfaces!

+0

Je crois que sa question est "Puis-je avoir des auto-proerties dans un ** * COM *** Interface ", le fait que cela sera utilisé pour COM et peut-être consommé par des programmes non .NET affecte-t-il la réponse? (Je ne dis pas que c'est le cas, je pense juste que ce facteur a besoin de clarification) –

+0

Comment l'implémentation de cette interface ressemblerait-elle si j'utilisais une auto-propriété? – MistyD

Questions connexes