C# 我可以在COM接口中拥有自动属性吗

C# 我可以在COM接口中拥有自动属性吗,c#,visual-studio,com,refactoring,C#,Visual Studio,Com,Refactoring,我目前有一个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);

我目前有一个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();
    }
现在有没有一个简单的快捷方式可以将下面的两行减为一行

            void set_price(float rx);
            float get_price();
我知道在课堂上我可以做这样的事情

int Price { get; set; }

但是,这在接口中有效吗?

您可以在接口中声明属性,这很好

COM只关心接口,而不关心接口的实现。您已经使用类似于自动特性定义的语法声明了特性

[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyObjects
{
    float price { get; set; }
    int size { get; set; }
}
如何实现该属性完全取决于您。是的,在实现接口的类中使用auto属性是可以的

[ComVisible(true), ClassInterface(ClassInterfaceType.None)]
public class MyObjects : IMyObjects {
    public float price { get; set; }
    public int size { get; set; }
}
请注意,COM类型库或本机代码中显示的长类型与C#中的int类型相同


下面是接口的IDL定义(假设在命名空间
CSDllCOMServer
中)


你指的是Visual Studio功能/快捷方式?是的,Visual Studio功能或宏(但C#没有宏)我认为有类似的东西,但我不能肯定地评论。哦,如果你的问题只是“我可以在界面中拥有自动属性吗”,那么答案是“可以”。本以为您正在Visual Studio中寻找一个键盘/函数快捷方式助手,它可以自动执行(如重构->提取方法),并更新所有引用/用法,以使用标准的get/set语法,而不是调用不存在的方法。@ChrisSinclair我相信他的问题是“我可以在COM接口中拥有自动权限吗”,在这种情况下,答案仍然是“是”吗?我相信他的问题是“我可以在COM接口中拥有自动权限吗”,这将用于COM并且可能被非.NET程序使用的事实是否会影响答案?(我并不是说它会,我只是认为这个因素需要澄清)如果我使用auto属性,这个接口的实现会是什么样子?你在我的回答中涵盖了我将要讨论的内容(你只是抢先一步),我在你的回答中为示例接口添加了IDL定义(我打算自己回答)。
[
  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);
};