c类引用,而不是实例引用

本文关键字:引用 实例 | 更新日期: 2023-09-27 18:25:08

我可以在C#中本地引用一个类,而不是一个类的实例吗?下面的代码不会编译,但作为一个例子,类似于:

void someFunc()
{
    var a = System.Math;
    var b = a.Abs(4);
}

edit:在实际程序中,它不是System.Math类,我想构造该类并返回构造的值。我最初并不认为我想要使用该类的上下文会被重新发布,而且可能不应该。

Anastasiosyal有一个有趣的想法,可以使用本地代理来完成。

c类引用,而不是实例引用

您可以引用一个类:

Type math = typeof(System.Math);

但是您不能使用常规点语法在上面调用静态方法:

// Wont compile:
math.Abs(5);

如果你只是想缩短(和IMHO混淆)你的代码,你可以通过using指令引用带有别名的类:

// Untested, but should work
namespace MyUnreadableCode {
    using m = System.Math;
    class Foo {
        public static Int32 Absolut(Int32 a) {
            return m.Abs(a);
        }
    }
}

不能为变量分配静态类的值。问题是为什么你想这样做,可能还有其他方法可以解决你的问题

例如,您可以使用委托来分配您想要执行的操作:

Func<int,int> operation = Math.Abs; 
// then you could use it like so: 
int processedValue = operation(-1);

在c#中,它们被称为类型。你可以这样分配它们:

Type a = typeof(SomeClass);

然而,你必须实例化它才能使用它。我相信你想要的是像java中那样的静态导入,但不幸的是,它们在c#中不存在。

简短回答:不喜欢上面的内容。

在C#6.0中,他们引入了一个静态导入功能,可以解决这个问题。

using static System.Math;
class MyProgram
{
    static void Main(string[] args)
    {
        var b = Abs(4); // No need to specify the name of Math class
    }
}

据我所知,您需要用短名称引用类吗?试试这个(在文件顶部,使用语句部分内部):

using m = System.Math;

稍后在您的代码中:

m.Abs(...)

有道理吗?

否。不可能将Type视为实例方法绑定到原始类型上的静态方法的值。为了做到这一点,您需要构造一个新的类型,将其方法调用转发到原始类型。

class MyMath { 
  public int Abs(int i) {
    return Math.Abs(i);
  }
}
var x = new MyMath();