Попробуйте это,
server {
server_name www.myweb.com;
rewrite ^/like/(.*) http://www.myweb.com/item.php?itemid=$1 permanent;
}
Используйте свойство 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 #, будет более подходящим.
Вы можете использовать это:
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>>
Столкнулся с этим и думал, что я совместно использую свое собственное решение. Это обрабатывает несколько универсальных аргументов, 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[][,,,]>>>
Если вы хотите, чтобы использовался базовый универсальный тип:
List<string> lstString = new List<string>();
Type type = lstString.GetType().GetGenericTypeDefinition();
Предполагая, что вы хотите использовать тип, сделайте что-нибудь, и что на самом деле вам не нужен фактическое определение строки, которое не так уж и полезно.
Если у вас есть экземпляр списка, вы можете вызвать .ToString () и получить следующее
System.Collections.Generic.List`1[System.String]
Это в дополнение к методам, предоставляемым другие ответы прямо противоположны типу, а не экземпляру.
Редактировать: В вашем редактировании я не верю, что это возможно без предоставления вашего собственного метода синтаксического анализа, поскольку List
- это сокращение C # для того, как реализован тип, вроде как если вы написали typeof (int) .ToString ()
, то будет записано не «int», а имя CTS, System.Int32 .