Как проверить, что класс создан компилятором - PullRequest
1 голос
/ 09 февраля 2020

Мне бы хотелось, чтобы метод проверял, является ли тип автоматически сгенерированным типом компилятором C# (например, лямбда-замыкания, действия, вложенные методы, анонимные типы и т. Д. c).

В настоящее время иметь следующее:

public bool IsCompilerGenerated(Type type)
{
    return type.Name.StartsWith("<>", StringComparison.OrdinalIgnoreCase);
}

С сопровождающим тестом:

    public class UnitTest1
    {
        class SomeInnerClass
        {

        }

        [Fact]
        public void Test()
        {
            // Arrange - Create Compiler Generated Nested Type
            var test = "test";

            void Act() => _testOutputHelper.WriteLine("Inside Action: " + test);

            // Arrange - Prevent Compiler Optimizations
            test = "";
            Act();

            var compilerGeneratedTypes = GetType().Assembly
                .GetTypes()
                .Where(x => x.Name.Contains("Display")) // Name of compiler generated class == "<>c__DisplayClass5_0"
                .ToList();

            Assert.False(IsCompilerGenerated(typeof(SomeInnerClass)));

            Assert.NotEmpty(compilerGeneratedTypes);
            Assert.All(compilerGeneratedTypes, type => Assert.True(IsCompilerGenerated(type)));
        }
    }

Есть ли лучший способ проверить типы, сгенерированные компилятором, а не имя?

1 Ответ

3 голосов
/ 10 февраля 2020

Предполагая, что Microsoft следует своим собственным инструкциям по применению System.Runtime.CompilerServices.CompilerGeneratedAttribute ,

Замечания

Примените атрибут CompilerGeneratedAttribute к любому элемент application, чтобы указать, что элемент сгенерирован компилятором.

Используйте атрибут CompilerGeneratedAttribute, чтобы определить, был ли элемент добавлен компилятором или создан непосредственно в исходном коде.

you можно проверить атрибуты CustomAttributes для типа, чтобы определить, имеет ли тип такой символ:

using System.Reflection;

public bool IsCompilerGenerated(Type type)
{
    return type.GetCustomAttribute<System.Runtime.CompilerServices.CompilerGeneratedAttribute>() != null;
}
...