在 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));
}
给我完整的班级名称&#34; this.that.OneClass&#34;。
我在 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
}
请注意,我不想使用类实例
答案 0 :(得分:10)
首先,让我们修复您的Java代码:此调用
System.out.println(MyClass.toString(OneClass));
除非您将.class
添加到OneClass
:,否则无法编译
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
作为前缀,则该语言允许您使用@
,但是应该尽一切努力避免使用此技巧。
答案 1 :(得分:0)
该行:
Console.WriteLine(MyClass.ToString(OneClass));
无效C#
。你需要这样做:
Console.WriteLine(MyClass.ToString(typeof(OneClass)));
答案 2 :(得分: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)));
答案 3 :(得分:0)
在C#中,你当然必须像其他人建议的那样使用typeof(OneClass)。
但是你的toString方法也是错误的,你必须使用Type.FullName来获取命名空间,而不仅仅是Type.Name