Как перечислить все классы с определенным атрибутом в сборке? - PullRequest
4 голосов
/ 27 мая 2010

Пожалуйста, помогите мне, как составить список всех классов с определенным атрибутом в сборке в C #?

Ответы [ 2 ]

6 голосов
/ 27 мая 2010

Пример кода, который получает все сериализуемые типы в сборке:

public IEnumerable<Type> GetTypesWithAttribute(Assembly assembly)
{
    return assembly.GetTypes()
        .Where(type => type.IsDefined(typeof(SerializableAttribute), false));
}

Второй аргумент IsDefined() - это то, должен ли атрибут быть просмотрен также и для базовых типов.

Пример использования, который находит все типы, украшенные MyDecorationAttribute:

public class MyDecorationAttribute : Attribute{}

[MyDecoration]
public class MyDecoratedClass{}

[TestFixture]
public class DecorationTests
{
    [Test]
    public void FindDecoratedClass()
    {
        var currentAssembly = Assembly.GetExecutingAssembly();
        var typesWithAttribute = GetTypesWithAttribute(currentAssembly);
        Assert.That(typesWithAttribute, 
                              Is.EquivalentTo(new[] {typeof(MyDecoratedClass)}));
    }

    public IEnumerable<Type> GetTypesWithAttribute(Assembly assembly)
    {
        return assembly.GetTypes()
            .Where(type => type.IsDefined(typeof(MyDecorationAttribute), false));
    }
}
0 голосов
/ 29 мая 2010

Я наконец-то написал свой собственный класс ClassLoader, который поддерживает .NET 2.0, 3.5 и 4.0.

static class ClassLoader
{
    public static IEnumerable<MethodInfo> GetMethodsWithAttribute(Type attributeType, Type type)
    {
        List<MethodInfo> list = new List<MethodInfo>();

        foreach (MethodInfo m in type.GetMethods())
        {
            if (m.IsDefined(attributeType, false))
            {
                list.Add(m);
            }
        }

        return list;
    }

    public static IEnumerable<Type> GetTypesWithAttribute(Type attributeType, string assemblyName)
    {
        Assembly assembly = Assembly.LoadFrom(assemblyName);
        return GetTypesWithAttribute(attributeType, assembly);
    }

    public static IEnumerable<Type> GetTypesWithAttribute(Type attributeType, Assembly assembly)
    {
        List<Type> list = new List<Type>();
        foreach (Type type in assembly.GetTypes())
        {
            if (type.IsDefined(attributeType, false))
                list.Add(type);
        }

        return list;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...