如何在C#中"导入"静态类?

pro*_*ice 15 c#

我创建了一个公共静态类utils.cs我想在其他类中使用它而不用带有utils的前缀方法,这样做的语法是什么?

Jon*_*eet 27

例如,在C#中无法做到这一点 - 没有直接等同于Java的静态导入功能.

有关这种情况的更多信息,请参阅Eric Lippert关于该主题的帖子以及类似的SO问题.

但是,在某些情况下,编写扩展方法可能是有意义的,这些方法存在于非嵌套的静态类中,但"假装"为不同类的实例方法.在介绍它们之前,值得仔细思考,因为它们可能令人困惑 - 但是当明智地使用它们时它们也可以提高可读性.

你在想什么样的实用方法?

  • 特别是,从*语言本身*的角度来看,它不是一个全局方法调用.语言只是认为你在字符串上调用扩展方法......这与IMO要求的内容完全不同. (3认同)

Rob*_*les 15

Jon Skeet没有告诉你的是你可以在c#中拥有全局静态成员.您的实用程序类确实可以在c#中成为现实.

遗憾的是,微软已经确定构建上述成员的过程仅仅是"正常"开发,并要求您使用原始中间语言来构建它们.这种强大的模式高于常见的语法高亮和友好的图标.

这是utf-8字符的必要序列(谨慎保护):

.assembly globalmethods {}

.method static public void MyUtilMethod() il managed 
{
  ldstr "Behold, a global method!"
  call void [mscorlib]System.Console::WriteLine(class System.String) 
  ret
}
Run Code Online (Sandbox Code Playgroud)

(您可以通过从SDK命令提示符调用ilasm.exe来编译此示例,记住使用/ dll开关)


ilasm.exe输出:

Microsoft(R).NET Framework IL汇编程序.版本2.0.50727.4016版权所有(c)Microsoft Corporation.版权所有.将'globalmethods.msil'汇编到DLL - >'globalmethods.dll'源文件是ANSI

global.msil(7):warning - 对未声明的extern程序集'mscorlib'的引用.尝试自动检测

汇编的全局方法MyUtilMethod

创建PE文件

发送课程:

发射场和方法:全球方法:1;

发送事件和属性:全局写入PE文件操作成功完成


编译完新创建的程序集后(例如"globalmethods.dll"),只需在Visual Studio中添加引用即可.当这完成后,你最好坐下来,因为是时候写一些真正的代码了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

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

            "MyUtilMethod".Call();

            Console.ReadKey();

        }

    }

    /// <summary>
    /// Reduces the amount of code for global call
    /// </summary>
    public static class GlobalExtensionMethods 
    {
        public static void Call(this string GlobalMethodName)
        {
            Assembly.Load("globalmethods")
                .GetLoadedModules()[0].GetMethod(GlobalMethodName)
                    .Invoke(null,null);

        }

    }


}
Run Code Online (Sandbox Code Playgroud)

是的,你刚刚在c#中调用了一个Global方法.

*请不要使用它,仅作为示例:-)另外,您可以使用支持它们的另一种语言编写全局方法,例如VB.NET.

  • 除了一定程度的痛苦之外,如果你必须调用.Call()扩展方法来反映到程序集中以调用你的方法,那么这就没有意义了.只需将MathLib作为静态类,将所有方法转换为扩展方法即可.(作为奖励,您可以获得智慧和类型安全) (3认同)

Fra*_*bem 7

使用 C# 6,您现在可以使用静态导入(请参阅msdn)例如,

using static Utils;
Run Code Online (Sandbox Code Playgroud)