Få typenavnet

Få typenavnet

Brug egenskaben FullName.

typeof(List<string>).FullName

Det vil give dig parametrene navneområde + klasse + type.

Det du beder om er en C#-specifik syntaks. Hvad angår .NET, er dette korrekt:

System.Collections.Generic.List`1[System.String]

Så for at få det, du vil have, skal du skrive en funktion for at bygge den, som du vil have den. Måske sådan:

static string GetCSharpRepresentation( Type t, bool trimArgCount ) {
    if( t.IsGenericType ) {
        var genericArgs = t.GetGenericArguments().ToList();

        return GetCSharpRepresentation( t, trimArgCount, genericArgs );
    }

    return t.Name;
}

static string GetCSharpRepresentation( Type t, bool trimArgCount, List<Type> availableArguments ) {
    if( t.IsGenericType ) {
        string value = t.Name;
        if( trimArgCount && value.IndexOf("`") > -1 ) {
            value = value.Substring( 0, value.IndexOf( "`" ) );
        }

        if( t.DeclaringType != null ) {
            // This is a nested type, build the nesting type first
            value = GetCSharpRepresentation( t.DeclaringType, trimArgCount, availableArguments ) + "+" + value;
        }

        // Build the type arguments (if any)
        string argString = "";
        var thisTypeArgs = t.GetGenericArguments();
        for( int i = 0; i < thisTypeArgs.Length && availableArguments.Count > 0; i++ ) {
            if( i != 0 ) argString += ", ";

            argString += GetCSharpRepresentation( availableArguments[0], trimArgCount );
            availableArguments.RemoveAt( 0 );
        }

        // If there are type arguments, add them with < >
        if( argString.Length > 0 ) {
            value += "<" + argString + ">";
        }

        return value;
    }

    return t.Name;
}

For disse typer (med sand som 2. param):

typeof( List<string> ) )
typeof( List<Dictionary<int, string>> )

Det returnerer:

List<String>
List<Dictionary<Int32, String>>

Generelt vil jeg dog vædde på, at du sandsynligvis ikke bruger for at have C#-repræsentationen af ​​din kode, og måske hvis du gør det, ville et format bedre end C#-syntaksen være mere passende.


Du kan bruge dette:

public static string GetTypeName(Type t) {
  if (!t.IsGenericType) return t.Name;
  if (t.IsNested && t.DeclaringType.IsGenericType) throw new NotImplementedException();
  string txt = t.Name.Substring(0, t.Name.IndexOf('`')) + "<";
  int cnt = 0;
  foreach (Type arg in t.GetGenericArguments()) {
    if (cnt > 0) txt += ", ";
    txt += GetTypeName(arg);
    cnt++;
  }
  return txt + ">";
}

For eksempel:

static void Main(string[] args) {
  var obj = new Dictionary<string, Dictionary<HashSet<int>, int>>();
  string s = GetTypeName(obj.GetType());
  Console.WriteLine(s);
  Console.ReadLine();
}

Output:

Dictionary<String, Dictionary<HashSet<Int32>, Int32>>

Hvis du har en forekomst af listen, kan du kalde .ToString() og få følgende

System.Collections.Generic.List`1[System.String]

Dette er ud over de metoder, som de andre svar giver direkte mod typen snarere end instansen.

Rediger: På din redigering tror jeg ikke, det er muligt uden at angive din egen parsingmetode, som List<string> er C#-stenografi for, hvordan typen er implementeret, ligesom hvis du skrev typeof(int).ToString() , det der fanges er ikke "int", men CTS-navnet, System.Int32 .