Недопустимое имя класса .NET, созданное компилятором.
-
22-09-2019 - |
Вопрос
Я шел через Начиная (с ПостШарп)
И когда я увидел, как PostSharp внедрил (верно ли это выражение?) код аспекта в сборку,
Я видел этот класс со странным названием, отмеченный значком CompilerGeneratedAttribute
.
Он назван <>AspectsImplementationDetails_1
.
Насколько я знаю, имя класса не может начинаться с <>
.
Но как PostSharp может создать такой класс?
Является <>
какой-то неизвестный/внутренний оператор?
[ОБНОВЛЯТЬ]Я провел некоторое тестирование и, похоже, мне удалось сгенерировать типы с интересными именами.
Вот пример используемого кода
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#, например.для анонимных типов или для резервных полей автоматических свойств.