如何在 C++/CLI 中声明将被视为 C# 中的扩展方法的方法?

发布于 2024-07-24 03:30:54 字数 117 浏览 7 评论 0原文

我正在用 C++/CLI 编写一个 .NET 程序集,以便在我们基于 C# 的应用程序中使用。 我希望应用程序将某些 C++ 方法视为扩展方法。 是否有一些属性可以应用于声明来指定某个方法应被视为 C# 的扩展方法?

I'm writing a .NET assembly in C++/CLI to be used in our C#-based application. I'd like the application to see some of the C++ methods as extension methods. Is there some attribute I can apply to the declaration to specify that a method should be seen as an extension method from C#?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

如此安好 2024-07-31 03:30:54

我遇到了同样的问题,这里是 C++/CLI 中扩展方法的一个小例子:

using namespace System;

namespace CPPLib 
{
    [System::Runtime::CompilerServices::Extension]
    public ref class StringExtensions abstract sealed
    {
    public: 
        [System::Runtime::CompilerServices::Extension]
        static bool MyIsNullOrEmpty(String^ s)
        {
            return String::IsNullOrEmpty(s);
        }
    };
}

这个扩展方法可以像 C# 中的任何其他方法一样使用:

using CPPLib;

namespace CShartClient
{
    class Program
    {
        static void Main( string[] args )
        {

            string a = null;
            Console.WriteLine( a.MyIsNullOrEmpty() ? "Null Or Empty" : "Not empty" );
            a = "Test";
            Console.WriteLine( a.MyIsNullOrEmpty() ? "Null Or Empty" : "Not empty" );
            Console.ReadKey();
        }
    }
}

不幸的是,C++ 似乎没有像 C# 那样为我们提供“语法糖” 。 至少我没有找到。

I had the same problem and here is a little example of an extension method in C++/CLI:

using namespace System;

namespace CPPLib 
{
    [System::Runtime::CompilerServices::Extension]
    public ref class StringExtensions abstract sealed
    {
    public: 
        [System::Runtime::CompilerServices::Extension]
        static bool MyIsNullOrEmpty(String^ s)
        {
            return String::IsNullOrEmpty(s);
        }
    };
}

This extension method can be used just like any other in C#:

using CPPLib;

namespace CShartClient
{
    class Program
    {
        static void Main( string[] args )
        {

            string a = null;
            Console.WriteLine( a.MyIsNullOrEmpty() ? "Null Or Empty" : "Not empty" );
            a = "Test";
            Console.WriteLine( a.MyIsNullOrEmpty() ? "Null Or Empty" : "Not empty" );
            Console.ReadKey();
        }
    }
}

Unfortunately it seems C++ does not provide us with the "syntactic sugar" like in C#. At least I did not find it.

递刀给你 2024-07-31 03:30:54

使用 Extension 属性应用于类和方法。

这里棘手的一点可能是静态类的概念 - C++/CLI 中可能不存在......我不确定。 当检测扩展方法时,C# 编译器可能并不真正关心该类是否是静态的,而仅在声明扩展方法时才关心。 没有它当然值得一试。

Make it a static method in a non-nested, non-generic static class, with the Extension attribute applied to both the class and the method.

The tricky bit here may be the concept of a static class - that may not exist in C++/CLI... I'm not sure. It's possible that the C# compiler doesn't really care whether or not the class is static when detecting an extension method, only when declaring one. It's certainly worth a try without it.

[浮城] 2024-07-31 03:30:54

我认为你不能。 扩展方法只是语法糖,由编译器转换为静态方法。

I don't think you can. Extension methods are merely syntactic sugar, converted to static methods by the compiler.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文