Java和C#的类名比较

3
Java中,我可以简单地使用这种类名:
public class MyClass
{
    public static String toString(Class<?> classType)
    {
        return classType.getName() ;
    }
}

package this.that;
public class OneClass
{
}

public static void main()
{
   System.out.println(MyClass.toString(OneClass));
}

我希望能够返回完整的类名 "this.that.OneClass"。

我在 C# 中尝试了相同的操作,但是遇到了一个错误,提示我正在使用 OneClass 作为类型。

public class MyClass
{
    public static String ToString(Type classType)
    {
        return classType.Name ;
    }
}

namespace this.that
{
    public class OneClass
    {
    }
}

static Main()
{
    Console.WriteLine(MyClass.ToString(OneClass));  // expecting "this.that.OneClass" result
}

注意,我不想使用类实例。

7
MyClass.ToString(typeof(OneClass)) - ASh
2
你不能使用 namespace this.that,最多只能使用 namespace @this.that - xanatos
4个回答

10

首先,让我们修复您的Java代码:这个调用

System.out.println(MyClass.toString(OneClass));

如果不在 OneClass 中添加 .class,它将无法编译:

System.out.println(MyClass.toString(OneClass.class));

C#中与.class语法等效的构造是typeof。它接受一个类型名称,并生成相应的System.Type对象:

Console.WriteLine(MyClass.ToString(typeof(OneClass)));

此外,C# 不允许将 this 用作标识符*,因此您应该将命名空间重命名以排除该关键字。最后,Name 将打印类的未限定名称。 如果想要看到带有命名空间的名称,请使用 FullName 属性:

public static String ToString(Type classType) {
    return classType.FullName;
}

演示。

* 如果您在this前面加上@,则可以使用该语言,但应尽一切努力避免使用此技巧。


2
另外,C#不允许将此作为标识符,但如果您在其前面添加“@”前缀,则可以。但我绝不建议这样做。 - Ron Beyer
@RonBeyer 谢谢,Ron! - Sergey Kalinichenko
哦,typeof 而不是 .class,谢谢。附:我从头编写了 Java 代码,只是一个例子,命名空间也是如此 :) 不管怎样,感谢您的备注。 - WonderMouse

0

这行代码:

Console.WriteLine(MyClass.ToString(OneClass));

不是有效的 C#。你需要做以下操作:

Console.WriteLine(MyClass.ToString(typeof(OneClass)));

0
你需要在C#中使用命名空间而不是包。
public class MyClass
{
    public static String toString(Type classType)
    {
        // returns the full name of the class including namespace
        return classType.FullName;
    }
}

你可以使用命名空间来封装类。
namespace outerscope.innerscope
{
    public class OneClass
    {
    }
}

打印全名

Console.WriteLine(MyClass.toString(typeof(outerscope.innerscope.OneClass)));

0
在C#中,你当然必须像其他人建议的那样使用typeof(OneClass)。
但是你的toString方法也是错误的,你必须使用Type.FullName来获取命名空间,而不仅仅是Type.Name。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接