我可以在本地引用C#中的类,而不是类的实例吗?以下代码不会编译,但作为示例,例如:
void someFunc()
{
var a = System.Math;
var b = a.Abs(4);
}
编辑:在真正的程序中,它不是System.Math类,我想构造类并返回构造的值。我最初并不认为我想要使用该类的上下文是相关的,可能它不应该是。
Anastasiosyal有一个有趣的想法,使用当地的代表来做。
答案 0 :(得分:8)
您可以引用一个类:
Type math = typeof(System.Math);
但你不能使用常规点语法在其上调用静态方法:
// Wont compile:
math.Abs(5);
如果您只是想缩短(和恕我直言,混淆)您的代码,您可以reference classes with aliases via a using directive:
// Untested, but should work
namespace MyUnreadableCode {
using m = System.Math;
class Foo {
public static Int32 Absolut(Int32 a) {
return m.Abs(a);
}
}
}
答案 1 :(得分:3)
您无法为变量分配静态类的值。问题是为什么你想要这样做,可能还有其他方法可以解决你的问题
e.g。您可以使用委托来分配您要执行的操作:
Func<int,int> operation = Math.Abs;
// then you could use it like so:
int processedValue = operation(-1);
答案 2 :(得分:2)
在c#中,他们被称为类型。你可以分配它们:
Type a = typeof(SomeClass);
但是,您必须将其实例化才能使用它。我相信你想要的是像java一样的静态导入,但不幸的是,它们在c#中不存在。
简短的回答:不像你上面的那样。
答案 3 :(得分:2)
在C#6.0中,他们引入了static import feature,可以解决问题。
using static System.Math;
class MyProgram
{
static void Main(string[] args)
{
var b = Abs(4); // No need to specify the name of Math class
}
}
答案 4 :(得分:1)
据我所知,你需要引用一个短名称的班级?试试这个(在文件顶部,使用语句部分):
using m = System.Math;
稍后在您的代码中:
m.Abs(...)
有道理吗?
答案 5 :(得分:0)
没有。将Type
视为实例方法绑定到原始类型上的静态方法的值是不可能的。为此,您需要构造一个新类型,将其方法调用转发为原始类型。
class MyMath {
public int Abs(int i) {
return Math.Abs(i);
}
}
var x = new MyMath();