“撇号”是什么意思?号”在具有泛型的属性的对象类型中(例如“Collection`1”)?

发布于 2024-11-18 16:27:39 字数 723 浏览 6 评论 0原文

我有一个带有属性 (MyProperty) 的对象 (MyObject)。我想获取它的类型名称(即 StringMyClass 等)。我使用:

PropertyInfo propInfo = typeof(MyObject).GetProperty("MyProperty");
Console.WriteLine(propInfo.PropertyType.Name);
Console.WriteLine(propInfo.PropertyType.FullName);

简单类型没有问题,但是当 MyProperty 是泛型类型时,我在获取其名称时遇到问题(例如 Collection)。它打印:

集合`1

System.Collections.ObjectModel.Collection`1[[System.String、mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089]]

那是什么`1 ?如何获取“Collection”?

I have an object (MyObject) with a property (MyProperty). I want to get it's type name (i.e. String or MyClass etc.). I use:

PropertyInfo propInfo = typeof(MyObject).GetProperty("MyProperty");
Console.WriteLine(propInfo.PropertyType.Name);
Console.WriteLine(propInfo.PropertyType.FullName);

No problem with simple types, but when MyProperty is a generic type, I face problems on getting it's name (e.g. Collection<String>). It prints:

Collection`1

System.Collections.ObjectModel.Collection`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

What is that `1? And how can I obtain "Collection<String>"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

何以笙箫默 2024-11-25 16:27:39

`1 表示泛型类型,具有 1 个泛型参数。

获取字符串的一种方法是使用 System.CodeDom,正如@LukeH建议的:

using System;
using System.CodeDom;
using System.Collections.Generic;
using Microsoft.CSharp;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var p = new CSharpCodeProvider())
            {
                var r = new CodeTypeReference(typeof(Dictionary<string, int>));
                
                Console.WriteLine(p.GetTypeOutput(r));
            }
        }
    }
}

另一种方法是此处
请参阅下面的 @jaredpar 的代码:

public static string GetFriendlyTypeName(Type type) {
    if (type.IsGenericParameter)
    {
        return type.Name;
    }

    if (!type.IsGenericType)
    {
        return type.FullName;
    }

    var builder = new System.Text.StringBuilder();
    var name = type.Name;
    var index = name.IndexOf("`");
    builder.AppendFormat("{0}.{1}", type.Namespace, name.Substring(0, index));
    builder.Append('<');
    var first = true;
    foreach (var arg in type.GetGenericArguments())
    {
        if (!first)
        {
            builder.Append(',');
        }
        builder.Append(GetFriendlyTypeName(arg));
        first = false;
    }
    builder.Append('>');
    return builder.ToString();
}

The `1 means a generic type, with 1 generic parameter.

One way of getting the string is by using the System.CodeDom, as suggested by @LukeH:

using System;
using System.CodeDom;
using System.Collections.Generic;
using Microsoft.CSharp;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var p = new CSharpCodeProvider())
            {
                var r = new CodeTypeReference(typeof(Dictionary<string, int>));
                
                Console.WriteLine(p.GetTypeOutput(r));
            }
        }
    }
}

An alternative method is here.
See below for @jaredpar's code:

public static string GetFriendlyTypeName(Type type) {
    if (type.IsGenericParameter)
    {
        return type.Name;
    }

    if (!type.IsGenericType)
    {
        return type.FullName;
    }

    var builder = new System.Text.StringBuilder();
    var name = type.Name;
    var index = name.IndexOf("`");
    builder.AppendFormat("{0}.{1}", type.Namespace, name.Substring(0, index));
    builder.Append('<');
    var first = true;
    foreach (var arg in type.GetGenericArguments())
    {
        if (!first)
        {
            builder.Append(',');
        }
        builder.Append(GetFriendlyTypeName(arg));
        first = false;
    }
    builder.Append('>');
    return builder.ToString();
}
梦在夏天 2024-11-25 16:27:39

这是 CLR 内部类型名。

该数字是泛型类型参数的数量,因为类型可以重载。
Func`1Func`2 是不同的类型)

没有内置方法来获取 C# 风格的类型名,因为 CLR 与 C# 无关。

This is a CLR internal typename.

The number is the number of generic type parameters, since types can be overloaded.
(Func`1 and Func`2 are different types)

There is no built-in way to get a C#-style typename, since the CLR has nothing to do with C#.

£烟消云散 2024-11-25 16:27:39

SLAks 已经解释了`1 的含义。

关于第二个问题:您可以使用 Type.GetGenericArguments

if (propInfo.PropertyType.IsGenericType) {
    Type[] typeArguments = propInfo.PropertyType.GetGenericArguments();
    // typeArguments now contains an array of types ({String} in your example).
}

SLaks already explained what `1 means.

About your second question: You can obtain the name of the generic type parameters by using Type.GetGenericArguments:

if (propInfo.PropertyType.IsGenericType) {
    Type[] typeArguments = propInfo.PropertyType.GetGenericArguments();
    // typeArguments now contains an array of types ({String} in your example).
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文