Может ли атрибут обнаружить, к какому методу он применяется во время выполнения? - PullRequest
1 голос
/ 24 сентября 2010

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

[AttributeUsage(AttributeTargets.Method)]
public class CustomAttribute : Attribute {}

public class Foo
{
    [Custom]
    public void Method() {}
}

Затем я запрашиваю атрибут во время выполнения

var attribute = typeof(Foo)
    .GetMethod("Method")
    .GetCustomAttributes(false)
    .OfType<CustomAttribute>()
    .First();

Может ли "атрибут" сказать, что он был применен к методу "Метод" в классе "Foo"?

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

Я верю, что нет, но если бы это было возможно, это не помогло бы.

Я объясню.

Атрибуты создаются только после того, как вы их запросите. Если вы просто откроете dll, ни один из добавленных вами атрибутов не будет создан. Сначала вам нужно получить указатель на объект, к которому применяются атрибуты, а затем, как только вы запросите его атрибуты, .net Framework создаст их для вас. Таким образом, к тому моменту, когда они будут созданы и ваш код оценит их, вы уже знаете , к чему они применяются.

Из-за этого, я считаю, рекомендуется не вкладывать слишком много магии в сами атрибуты.

0 голосов
/ 24 сентября 2010

Не по-встроенному.Если атрибут содержит логику метода, которая требует знания того, что он украшает, метод должен принимать параметр MemberInfo (или более производный тип, такой как MethodInfo, PropertyInfo, FieldInfo и т. Д.) Или Object, если экземпляр должен передаваться напрямую.Затем при вызове логики для атрибута ему может быть дан экземпляр или соответствующий класс метаданных, из которого он был получен в первую очередь управляющим кодом.

...