Сообщение Re[2]: Своя реализация Type.FullName от 20.06.2021 3:56
Изменено 21.06.2021 20:01 DDDX
Re[2]: Своя реализация Type.FullName
Здравствуйте, Danchik, Вы писали:
КД>>Не подскажите, где можно украсть правильное решение?
D>https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/Common/Internal/TypeExtensions.cs#L39
Не, ну это как у меня. Нечестно интересно.
Кста, меня терзают смутные сомнения насчет правильности обработки нулевого значения.
---
Я тут ночью проснулся и подумал — "дурень я дурень, надо было другие данные смотреть"
Смотрим сверху вниз — от корневого класса к вложенному.
Количество параметров generic-типа — это разница текущего и предыдущего значения GetGenericArguments().Length.
Или, другими словами this.GetType().GetGenericArguments().Length — this.DeclaringType().GetGenericArguments().Length
Это для этого, конкретного случая, когда нет наследования generic-интерфейсов.
А если еще наследуются generic-интерфейсы, то наверное надо учитывать GetGenericArguments().Length реализуемых интерфейсов.
Там наверное надо выполнять обход реализуемых интерфейсов, чтобы правильно вычислять индекс первого аргумента (offset) в type.GetGenericArguments() — tagBuildHumanNameCtx.iGenericArg.
UPD
Это я не туда стал думать. Интерефейсы наследуются, а тут у нас вложенные конструкции.
Так что тут все норм.
Идея с "разница текущего и предыдущего значения GetGenericArguments().Length" работает на ура.
Там правда ничего вычитать не надо. Надо просто запоминать сколько generic параметров у охватывающего класса. Если оно равно текущему — значит generic параметров нет.
---
Все перерыл — не нашел где в Type можно взять "чистое" имя generic типа без этого '`'. Походу такого свойства нет.
КД>>Не подскажите, где можно украсть правильное решение?
D>https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/Common/Internal/TypeExtensions.cs#L39
var genericPartIndex = type.Name.IndexOf('`');
if (genericPartIndex <= 0)
{
builder.Append(type.Name);
return;
}
Не, ну это как у меня. Не
Кста, меня терзают смутные сомнения насчет правильности обработки нулевого значения.
---
Я тут ночью проснулся и подумал — "дурень я дурень, надо было другие данные смотреть"
Test_09__nested_01_spec:
type.Name: "tagCLASS09_01`1" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_02" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_03`2" type.GenericTypeArguments: 3 type.GenericTypeParameters: 0 type.GetGenericArguments: 3
Test_09__nested_02_gen:
type.Name: "tagCLASS09_01`1" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_02" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_03`2" type.GenericTypeArguments: 0 type.GenericTypeParameters: 3 type.GetGenericArguments: 3
Смотрим сверху вниз — от корневого класса к вложенному.
Количество параметров generic-типа — это разница текущего и предыдущего значения GetGenericArguments().Length.
Или, другими словами this.GetType().GetGenericArguments().Length — this.DeclaringType().GetGenericArguments().Length
Это для этого, конкретного случая, когда нет наследования generic-интерфейсов.
А если еще наследуются generic-интерфейсы, то наверное надо учитывать GetGenericArguments().Length реализуемых интерфейсов.
UPD
Это я не туда стал думать. Интерефейсы наследуются, а тут у нас вложенные конструкции.
Так что тут все норм.
Идея с "разница текущего и предыдущего значения GetGenericArguments().Length" работает на ура.
Там правда ничего вычитать не надо. Надо просто запоминать сколько generic параметров у охватывающего класса. Если оно равно текущему — значит generic параметров нет.
---
Все перерыл — не нашел где в Type можно взять "чистое" имя generic типа без этого '`'. Походу такого свойства нет.
Re[2]: Своя реализация Type.FullName
Здравствуйте, Danchik, Вы писали:
КД>>Не подскажите, где можно украсть правильное решение?
D>https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/Common/Internal/TypeExtensions.cs#L39
Не, ну это как у меня. Нечестно интересно.
Кста, меня терзают смутные сомнения насчет правильности обработки нулевого значения.
---
Я тут ночью проснулся и подумал — "дурень я дурень, надо было другие данные смотреть"
Смотрим сверху вниз — от корневого класса к вложенному.
Количество параметров generic-типа — это разница текущего и предыдущего значения GetGenericArguments().Length.
Или, другими словами this.GetType().GetGenericArguments().Length — this.DeclaringType().GetGenericArguments().Length
Это для этого, конкретного случая, когда нет наследования generic-интерфейсов.
А если еще наследуются generic-интерфейсы, то наверное надо учитывать GetGenericArguments().Length реализуемых интерфейсов.
Там наверное надо выполнять обход реализуемых интерфейсов, чтобы правильно вычислять индекс первого аргумента (offset) в type.GetGenericArguments() — tagBuildHumanNameCtx.iGenericArg.
UPD
Это я не туда стал думать. Интерфейсы наследуются, а тут у нас вложенные конструкции.
Так что тут все норм.
Идея с "разница текущего и предыдущего значения GetGenericArguments().Length" работает на ура.
Там правда ничего вычитать не надо. Надо просто запоминать сколько generic параметров у охватывающего класса. Если оно равно текущему — значит generic параметров нет.
---
Все перерыл — не нашел где в Type можно взять "чистое" имя generic типа без этого '`'. Походу такого свойства нет.
КД>>Не подскажите, где можно украсть правильное решение?
D>https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/Common/Internal/TypeExtensions.cs#L39
var genericPartIndex = type.Name.IndexOf('`');
if (genericPartIndex <= 0)
{
builder.Append(type.Name);
return;
}
Не, ну это как у меня. Не
Кста, меня терзают смутные сомнения насчет правильности обработки нулевого значения.
---
Я тут ночью проснулся и подумал — "дурень я дурень, надо было другие данные смотреть"
Test_09__nested_01_spec:
type.Name: "tagCLASS09_01`1" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_02" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_03`2" type.GenericTypeArguments: 3 type.GenericTypeParameters: 0 type.GetGenericArguments: 3
Test_09__nested_02_gen:
type.Name: "tagCLASS09_01`1" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_02" type.GenericTypeArguments: 0 type.GenericTypeParameters: 1 type.GetGenericArguments: 1
type.Name: "tagCLASS09_03`2" type.GenericTypeArguments: 0 type.GenericTypeParameters: 3 type.GetGenericArguments: 3
Смотрим сверху вниз — от корневого класса к вложенному.
Количество параметров generic-типа — это разница текущего и предыдущего значения GetGenericArguments().Length.
Или, другими словами this.GetType().GetGenericArguments().Length — this.DeclaringType().GetGenericArguments().Length
Это для этого, конкретного случая, когда нет наследования generic-интерфейсов.
А если еще наследуются generic-интерфейсы, то наверное надо учитывать GetGenericArguments().Length реализуемых интерфейсов.
UPD
Это я не туда стал думать. Интерфейсы наследуются, а тут у нас вложенные конструкции.
Так что тут все норм.
Идея с "разница текущего и предыдущего значения GetGenericArguments().Length" работает на ура.
Там правда ничего вычитать не надо. Надо просто запоминать сколько generic параметров у охватывающего класса. Если оно равно текущему — значит generic параметров нет.
---
Все перерыл — не нашел где в Type можно взять "чистое" имя generic типа без этого '`'. Походу такого свойства нет.