10

MyObjectプロパティ ( ) を持つオブジェクト ( ) がありますMyPropertyStringタイプ名(つまりなど)を取得したいMyClass。私が使う:

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

単純型では問題ありませんMyPropertyが、ジェネリック型の場合、名前を取得する際に問題が発生します (例: Collection<String>)。それは印刷します:

コレクション`1

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

それは何`1ですか?どうすれば「 」を入手できCollection<String>ますか?

4

3 に答える 3

11

`1、1つのジェネリックパラメーターを持つジェネリック型を意味します。

文字列を取得する1つの方法は、@ LukeHによって提案されているように、 System.CodeDomを使用することです。

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();
}
于 2011-07-05T14:29:13.477 に答える
8

これは CLR 内部型名です。

型はオーバーロードできるため、この数はジェネリック型パラメーターの数です。
(Func`1Func`2は異なるタイプ)

CLR は C# とは関係がないため、C# スタイルの型名を取得する組み込みの方法はありません。

于 2011-07-05T14:26:46.223 に答える
0

SLaks は、`1 が何を意味するかを既に説明しました。

2 番目の質問について: Type.GetGenericArgumentsを使用して、ジェネリック型パラメーターの名前を取得できます。

if (propInfo.PropertyType.IsGenericType) {
    Type[] typeArguments = propInfo.PropertyType.GetGenericArguments();
    // typeArguments now contains an array of types ({String} in your example).
}
于 2011-07-05T14:32:35.867 に答える