Недопустимое имя класса .NET, созданное компилятором.

StackOverflow https://stackoverflow.com/questions/1586600

Вопрос

Я шел через НачинаяПостШарп)

И когда я увидел, как PostSharp внедрил (верно ли это выражение?) код аспекта в сборку,
Я видел этот класс со странным названием, отмеченный значком CompilerGeneratedAttribute. alt text

Он назван <>AspectsImplementationDetails_1.
Насколько я знаю, имя класса не может начинаться с <>.
Но как PostSharp может создать такой класс?

Является <> какой-то неизвестный/внутренний оператор?


[ОБНОВЛЯТЬ]Я провел некоторое тестирование и, похоже, мне удалось сгенерировать типы с интересными именами.alt text

Вот пример используемого кода

using System;
using System.Reflection;
using System.Reflection.Emit;

namespace ReflectionDemo
{
    class Program
    {
        public static void Main(string[] args)
        {
            var typeNames = new[] 
            {
                "<>", "-", "+", "~", "!", "@", "#", "$", "%", "^", "&", 
                "*", "(", ")", "="
            };
            const string assemblyName = "Test";
            foreach (var typeName in typeNames)
            {
                PrintTypeName(
                    BuildType(assemblyName, typeName).CreateType());
            }
        }

        private static void PrintTypeName(Type type)
        {
            Console.WriteLine("TypeName = '{0}'", type.FullName);
        }

        private static TypeBuilder BuildType(
            string assemblyName, string typeName)
        {
            var name = new AssemblyName(assemblyName);
            var assemblyBuilder = 
                AppDomain.CurrentDomain.DefineDynamicAssembly(
                    name, AssemblyBuilderAccess.Run);
            var moduleBuilder = 
                assemblyBuilder.DefineDynamicModule(name.Name, false);
            return moduleBuilder.DefineType(
                typeName, TypeAttributes.Public);
        }
    }
}
Это было полезно?

Решение

С# исходный код не может содержать имена, начинающиеся с <>.Но имена CLR имеют больше свободы, поэтому компиляторы (например, компилятор C# и PostSharp) могут генерировать такие имена.Это очень полезно, поскольку гарантирует, что имена, сгенерированные компилятором, никогда не будут конфликтовать с именами, которые вы используете в исходном коде.Вы также увидите их, сгенерированные самим компилятором C#, например.для анонимных типов или для резервных полей автоматических свойств.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top