Nome da classe .NET gerado pelo compilador inválido
-
22-09-2019 - |
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
.
É 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.
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);
}
}
}
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.