Получите имя типа

Попробуйте это,

server {
  server_name www.myweb.com;
  rewrite ^/like/(.*) http://www.myweb.com/item.php?itemid=$1 permanent;
}
35
задан Neir0 5 April 2010 в 17:16
поделиться

6 ответов

Используйте свойство FullName .

typeof(List<string>).FullName

Это даст вам параметры пространства имен + класс + тип.

Вы просите о синтаксисе, специфичном для C #. Что касается .NET, это правильно:

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

Итак, чтобы получить то, что вы хотите, вам придется написать функцию, которая построит ее так, как вы этого хотите. Возможно так:

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;
}

Для этих типов (со вторым параметром true):

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

Он возвращает:

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

В общем, я уверен, что вам, вероятно, не понадобится , чтобы иметь C # представление вашего кода и, возможно, если вы это сделаете, какой-то формат лучше, чем синтаксис C #, будет более подходящим.

35
ответ дан 27 November 2019 в 07:16
поделиться

Вы можете использовать это:

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 + ">";
}

Например:

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

Вывод:

Dictionary<String, Dictionary<HashSet<Int32>, Int32>>
6
ответ дан 27 November 2019 в 07:16
поделиться

Столкнулся с этим и думал, что я совместно использую свое собственное решение. Это обрабатывает несколько универсальных аргументов, nullables, зубчатых массивов, многомерных массивов, комбинаций зубчатых / многомерных массивов и любые вложенные комбинации любого вышеупомянутого. Я использую его главным образом для входа так, чтобы было легче определить сложные типы.

public static string GetGoodName(this Type type)
{
    var sb = new StringBuilder();

    void VisitType(Type inType)
    {
        if (inType.IsArray)
        {
            var rankDeclarations = new Queue<string>();
            Type elType = inType;

            do
            {
                rankDeclarations.Enqueue($"[{new string(',', elType.GetArrayRank() - 1)}]");
                elType = elType.GetElementType();
            } while (elType.IsArray);

            VisitType(elType);

            while (rankDeclarations.Count > 0)
            {
                sb.Append(rankDeclarations.Dequeue());
            }
        }
        else
        {
            if (inType.IsGenericType)
            {
                var isNullable = inType.IsNullable();
                var genargs = inType.GetGenericArguments().AsEnumerable();
                var numer = genargs.GetEnumerator();

                numer.MoveNext();

                if (!isNullable) sb.Append($"{inType.Name.Substring(0, inType.Name.IndexOf('`'))}<");

                VisitType(numer.Current);

                while (numer.MoveNext())
                {
                    sb.Append(",");
                    VisitType(numer.Current);
                }

                if (isNullable)
                {
                    sb.Append("?");
                }
                else
                {
                    sb.Append(">");
                }
            }
            else
            {
                sb.Append(inType.Name);
            }
        }
    }

    VisitType(type);

    var s = sb.ToString();

    return s;
}

Это:

typeof(Dictionary<int?, Tuple<string[], List<string[][,,,]>>>).GetGoodName()

... возвраты это:

Dictionary<Int32?,Tuple<String[],List<String[][,,,]>>>
0
ответ дан 27 November 2019 в 07:16
поделиться
typeof(List<string>).ToString()
2
ответ дан 27 November 2019 в 07:16
поделиться

Если вы хотите, чтобы использовался базовый универсальный тип:

List<string> lstString = new List<string>();
Type type = lstString.GetType().GetGenericTypeDefinition();

Предполагая, что вы хотите использовать тип, сделайте что-нибудь, и что на самом деле вам не нужен фактическое определение строки, которое не так уж и полезно.

0
ответ дан 27 November 2019 в 07:16
поделиться

Если у вас есть экземпляр списка, вы можете вызвать .ToString () и получить следующее

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

Это в дополнение к методам, предоставляемым другие ответы прямо противоположны типу, а не экземпляру.

Редактировать: В вашем редактировании я не верю, что это возможно без предоставления вашего собственного метода синтаксического анализа, поскольку List - это сокращение C # для того, как реализован тип, вроде как если вы написали typeof (int) .ToString () , то будет записано не «int», а имя CTS, System.Int32 .

2
ответ дан 27 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: