Порядок атрибутов имеет какие-либо гарантии?

Если несколько атрибутов применяются к участнику, например.

[Foo]
[Bar]
void Baz() { ... }

Тогда любые гарантии, сделанные спецификациями CLR/.NET относительно того, какой порядок они будут получены в при получении отражением (например. Attribute.GetCustomAttributes)? Документация для этих методов не делает это явным, и в то время как это, действительно кажется, имеет место, что они возвращаются в порядке, они применяются, я не хочу полагаться на недокументированное поведение, поскольку это просто напрашивается на неприятности.

Что касается того, почему это могло бы быть важно, предположить, что атрибуты используются, чтобы указать, что метод должен иметь серию перехватчиков, которые должны работать в определенном порядке.

10
задан Greg Beech 11 February 2010 в 11:48
поделиться

3 ответа

Нет из 17.2 Спецификация атрибута не похоже.

Порядок, в котором атрибуты указаны в таком списке, и порядок , в котором упорядочены разделы, прикрепленные к одному и тому же объекту программы, не имеет значения. Например, спецификации атрибутов [A] [B], [B] [A], [A, B] и [B, A] эквивалентны.

14
ответ дан 3 December 2019 в 17:58
поделиться

Программирование на интерфейс, а не реализация:

public interface IFoo
{
    int MyProp { get; }
}

public interface IFooWithSetter
{
    int MyProp { get; set; }
}

public class FooImplementation : IFoo, IFooWithSetter
{
    public int MyProp
    {
        get { return 100; }
        set { }
    }
}  

Пример использования:

IFoo var1 = new FooImplementation(); // only getter is available in var1
IFooWithSetter var2 = (IFooWithSetter) var1; // setter and getter is available in var2  

Можно легко использовать некоторые частные модификаторы для интерфейсов с различными контрактами. Это решение простое, и ИМО это подходит для вашей задачи.
И если вы думаете, что будет легко сделать некоторые действия, которые вы пытаетесь скрыть/ограничить, вы правы. И то же самое с любым возможным способом.

-121--4222879-

Ассемблер

Протестирован с помощью WinXP DOS box (cmd.exe):

    xchg cx,bp
    std
    mov al,2
    rep stosb
    inc cl
l0: ; to save a byte, I've encoded the instruction to exit the program into the
    ; low byte of the offset in the following instruction:
    lea si,[di+01c3h] 
    push si
l1: mov dx,bp
    mov ah,6
    int 21h
    jz l2
    mov bl,al
    shr byte ptr [di+bx],cl
    jz l1
    inc si
    mov [si],bx
    jmp l1
l2: pop si
l3: inc si
    mov bl,[si]
    cmp bl,bh
    je l0+2
    cmp [di+bx],cl
    jne l3
    mov dl,bl
    mov ah,2
    int 21h
    jmp l3

Сборка до 53 байт. Считывает стандартный ввод и записывает результаты в стандартный вывод, например:

 programname < input > output
-121--2090866-

Полагаясь на заказ для такого рода вещей, как правило, плохая идея. Если порядок важен, я бы дал атрибуту свойство Priority, чтобы его можно было сделать очень явным.

Я не знаю никаких гарантий того, что они будут получены в первоначальном порядке.

6
ответ дан 3 December 2019 в 17:58
поделиться

imo Атрибуты не должны иметь порядок, поскольку они не являются конструкциями управления потоком.

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

2
ответ дан 3 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: