C# 获取没有完整命名空间的类型名
我有以下代码:C# 获取没有完整命名空间的类型名,c#,namespaces,typeof,C#,Namespaces,Typeof,我有以下代码: return "[Inserted new " + typeof(T).ToString() + "]"; 但是 返回包含命名空间的全名 是否只需要获取类名(没有任何名称空间限定符?使用() 您可以这样做: typeof(T).Name; 尝试以下操作以获取泛型类型的类型参数: public static string CSharpName(this Type type) { var sb = new StringBuilder(); var name = t
return "[Inserted new " + typeof(T).ToString() + "]";
但是
返回包含命名空间的全名
是否只需要获取类名(没有任何名称空间限定符?使用()
您可以这样做:
typeof(T).Name;
尝试以下操作以获取泛型类型的类型参数:
public static string CSharpName(this Type type)
{
var sb = new StringBuilder();
var name = type.Name;
if (!type.IsGenericType) return name;
sb.Append(name.Substring(0, name.IndexOf('`')));
sb.Append("<");
sb.Append(string.Join(", ", type.GetGenericArguments()
.Select(t => t.CSharpName())));
sb.Append(">");
return sb.ToString();
}
公共静态字符串CSharpName(此类型)
{
var sb=新的StringBuilder();
var name=type.name;
如果(!type.IsGenericType)返回名称;
sb.Append(name.Substring(0,name.IndexOf('`'));
某人加上(“”);
使某人返回字符串();
}
也许不是最好的解决方案(由于递归),但它是有效的。输出如下所示:
Dictionary<String, Object>
字典
在C#6.0(包括)之后,您可以使用以下表达式:
using Stuff = Some.Cool.Functionality
class C {
static int Method1 (string x, int y) {}
static int Method1 (string x, string y) {}
int Method2 (int z) {}
string f<T>() => nameof(T);
}
var c = new C()
nameof(C) -> "C"
nameof(C.Method1) -> "Method1"
nameof(C.Method2) -> "Method2"
nameof(c.Method1) -> "Method1"
nameof(c.Method2) -> "Method2"
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error
nameof(Stuff) = "Stuff"
nameof(T) -> "T" // works inside of method but not in attributes on the method
nameof(f) -> “f”
nameof(f<T>) -> syntax error
nameof(f<>) -> syntax error
nameof(Method2()) -> error “This expression does not have a name”
使用Stuff=Some.Cool.Functionality
C类{
静态int Method1(字符串x,int y){}
静态int Method1(字符串x,字符串y){}
int Method2(int z){}
字符串f()=>nameof(T);
}
var c=新的c()
姓名(C)->“C”
名称(C.Method1)->“Method1”
名称(C.Method2)->“Method2”
名称(c.Method1)->“Method1”
名称(c.Method2)->“Method2”
nameof(z)->“z”//Method2内部正常,Method1内部是编译器错误
名称(Stuff)=“Stuff”
nameof(T)->“T”//在方法内部工作,但不在方法的属性中工作
名称(f)->“f”
nameof(f)->语法错误
nameof(f)->语法错误
nameof(Method2())->错误“此表达式没有名称”
注意
nameof
无法获取底层对象的运行时类型,它只是编译时参数。如果一个方法接受IEnumerable,那么nameof只返回“IEnumerable”,而实际对象可以是“List”。顺便说一句,写入string1+anything.ToString()+string2
是多余的。如果您执行string1+anything+string2
,编译器将自动插入对ToString
的调用。听起来不刺耳,但是,您是否检查了Type
实例上可用的属性(由typeof(…)
返回)我确信你自己会知道……由于某种原因,文档中缺少了<代码>名称<代码>属性。至少,它不是我正在寻找的属性。<代码> Name <代码>不考虑类型参数。或者<代码>。GETType()。如果处理实例,<代码>名称< /代码>也不考虑嵌套类型!这应该是公认的答案,因为它正确地考虑了可能递归的泛型类型(例如字典)。+1表示概念。但不喜欢失败的过早优化。它在每个递归调用中创建一个新的StringBuilder
(即使是未使用的基本情况),但会忽略string.Join
临时和LINQ lambda。只需使用String
,直到您知道这是一个瓶颈/Rannigel,它说这可能不是最好的解决方案:)ShortName是一个较短的名称:)nameof
不返回类型的名称
@NigelTouch我已经检查过,并且nameof
返回类型的名称,带有证据的屏幕截图:抱歉,我解释得不好。我的意思是,它不获取底层对象的运行时类型
,它只是编译时参数。如果一个方法接受一个IEnumerable
,那么nameof
只返回“IEnumerable”,而实际对象可以是“List”。它不认为它回答了OP的问题。
public static string CSharpName(this Type type)
{
var sb = new StringBuilder();
var name = type.Name;
if (!type.IsGenericType) return name;
sb.Append(name.Substring(0, name.IndexOf('`')));
sb.Append("<");
sb.Append(string.Join(", ", type.GetGenericArguments()
.Select(t => t.CSharpName())));
sb.Append(">");
return sb.ToString();
}
Dictionary<String, Object>
using Stuff = Some.Cool.Functionality
class C {
static int Method1 (string x, int y) {}
static int Method1 (string x, string y) {}
int Method2 (int z) {}
string f<T>() => nameof(T);
}
var c = new C()
nameof(C) -> "C"
nameof(C.Method1) -> "Method1"
nameof(C.Method2) -> "Method2"
nameof(c.Method1) -> "Method1"
nameof(c.Method2) -> "Method2"
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error
nameof(Stuff) = "Stuff"
nameof(T) -> "T" // works inside of method but not in attributes on the method
nameof(f) -> “f”
nameof(f<T>) -> syntax error
nameof(f<>) -> syntax error
nameof(Method2()) -> error “This expression does not have a name”