Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取没有完整命名空间的类型名_C#_Namespaces_Typeof - Fatal编程技术网

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”