c类引用,而不是实例引用
本文关键字:引用 实例 | 更新日期: 2023-09-27 18:25:08
我可以在C#中本地引用一个类,而不是一个类的实例吗?下面的代码不会编译,但作为一个例子,类似于:
void someFunc()
{
var a = System.Math;
var b = a.Abs(4);
}
edit:在实际程序中,它不是System.Math类,我想构造该类并返回构造的值。我最初并不认为我想要使用该类的上下文会被重新发布,而且可能不应该。
Anastasiosyal有一个有趣的想法,可以使用本地代理来完成。
您可以引用一个类:
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();