Что означает «+» в отраженном FullName и «*» после члена c # - PullRequest
0 голосов
/ 06 мая 2018

Я сейчас занимаюсь отражением в c #. После того, как:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetTypes()

И я нашел это: [System.Numerics.Matrix4x4], [System.Numerics.Matrix4x4+CanonicalBasis], [System.Numerics.Matrix4x4+VectorBasis] (Есть отраженные типы из "System.Numerics.Vectors.dll") Я знаю, что Matrix4x4 является структурой, однако я не могу найти никакой информации о CanonicalBasis и VectorBasis, и что означает «+» в этом контексте. Я проводил дальнейшие исследования, и еще одна странная вещь:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").FullName
"System.Numerics.Matrix4x4+VectorBasis"

Но:

Assembly.LoadFile(@"C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.7\System.Numerics.Vectors.dll").GetType("System.Numerics.Matrix4x4+VectorBasis").Name
"VectorBasis"

Более того, когда я просматривал членов Matrix4x4 + VectorBasis, там был такой член:

[System.Numerics.Vector3* Element0] 

И это необработанный указатель, как в с ++? Или что это?

P.S. Я делал это в C # Interactive, но я не думаю, что это повлияло на результаты.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

В строке System.Numerics.Matrix4x4+VectorBasis, + означает, что VectorBasis является вложенным типом Matrix4x4. В данном конкретном случае VectorBasis является вложенным struct внутри class. Обратите внимание, что + - это один и тот же символ, независимо от того, с каким вложенным типом вы имеете дело:

class A
{
    public class B {}
}

struct A
{
    public struct B {}
}

class A
{
    public enum B {}  
}

Все вложенные типы в этих примерах имеют одинаковые FullName, A+B.

В вашем случае VectorBasis и CanonicalBasis являются private участниками, поэтому вы не можете видеть их через Type.GetNestedTypes(), который показывает только public участников.


* после System.Numerics.Vector3* означает, что это тип указателя . Строка взята из Type экземпляра свойства FieldInfo.FieldType.


Вы можете посмотреть это и другие возможные строковые представления класса Type на соответствующей странице документации MSDN .

0 голосов
/ 06 мая 2018

+ между именами классов означает, что часть после + является вложенным типом типа, имя которого находится перед +. Например Dictionary<string, string>+KeyCollection. KeyCollection является внутренним классом Dictionary<TKey, TValue>.

* обозначает действительно указатель, поскольку указанное поле находится в небезопасном режиме:

public unsafe Vector3* Element0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...