Информация об изменениях

Сообщение 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


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 реализуемых интерфейсов.

Там наверное надо выполнять обход реализуемых интерфейсов, чтобы правильно вычислять индекс первого аргумента (offset) в type.GetGenericArguments() — tagBuildHumanNameCtx.iGenericArg.

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


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 реализуемых интерфейсов.

Там наверное надо выполнять обход реализуемых интерфейсов, чтобы правильно вычислять индекс первого аргумента (offset) в type.GetGenericArguments() — tagBuildHumanNameCtx.iGenericArg.

UPD

Это я не туда стал думать. Интерфейсы наследуются, а тут у нас вложенные конструкции.

Так что тут все норм.

Идея с "разница текущего и предыдущего значения GetGenericArguments().Length" работает на ура.

Там правда ничего вычитать не надо. Надо просто запоминать сколько generic параметров у охватывающего класса. Если оно равно текущему — значит generic параметров нет.

---
Все перерыл — не нашел где в Type можно взять "чистое" имя generic типа без этого '`'. Походу такого свойства нет.