Pergunta

Eu estava passando Começando (com PostSharp)

E quando vi PostSharp injetado (essa expressão está certa?) Um código de aspecto na montagem,
Eu vi essa classe estranhamente nomeada marcada com CompilerGeneratedAttribute. alt text

É nomeado <>AspectsImplementationDetails_1.
Tanto quanto eu sei, o nome da classe não pode ser iniciado <>.
Mas como é possível para o PostSharp criar essa classe?

É <> algum tipo de operador desconhecido/interno?


ATUALIZARFiz alguns testes e parece que consegui gerar tipos com nomes interessantes.alt text

Aqui está o código de amostra usado

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);
        }
    }
}
Foi útil?

Solução

C# Código fonte Não posso conter nomes começando com <>. Mas os nomes do CLR têm mais liberdade, para que os compiladores (como o compilador C# e o PostSharp) possam gerar esses nomes. Isso é muito útil porque garante que os nomes gerados pelo compilador nunca se chocam com os nomes que você usa no seu código-fonte. Você também os verá gerados pelo próprio compilador C#, por exemplo, para tipos anônimos ou para os campos de apoio das propriedades automáticas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top