Прохладное использование Атрибутов или Аннотаций (CLR или Java)?

Если ваши данные не являются массивом, не используйте функцию карты. Измените свой код, как показано ниже:

 render() {
        return (
            <div>
                {
                    this.state.data &&
                        <div key={this.state.data.key}>
                            {this.state.data.display}
                            {this.state.data.nutrition}
                        </div>
                }
            </div>
        )
    }
9
задан Robert Gould 28 January 2009 в 09:15
поделиться

8 ответов

  • пострезкий, который использует атрибуты для введения кода (AOP)?
  • [TypeDescriptionProvider] который может использоваться для обеспечения пользовательской модели свойства времени выполнения - или совершенно другие свойства или возможно более быстрые

И некоторые базовые, которые часто пропускаются:

  • [TypeForwardedTo] - используемый для перемещения типов между блоками без восстановления
  • [PrincipalPermission] - используемый для автоматического осуществления безопасности на участниках
12
ответ дан 4 December 2019 в 07:36
поделиться

Проверьте xUnit и посмотрите, как атрибуты используются для маркировки модульных тестов на ожидаемое поведение, а также данные канала в тесты. Атрибуты используются более значимым способом, чем MSTest или NUnit.

От Samples\TestMethodExtensibility\Example.cs:

public class Example
{
    static int val;

    [RepeatTest(5, Timeout=250)]
    public void RepeatingTestMethod()
    {
        Thread.Sleep(100);
        Assert.Equal(2, 2);

        if (val == 0)
        {
            val++;
            Thread.Sleep(1000);
        }
    }
}

От теста xunit.extensions\DataTheories\TheoryAttributeTests.cs:

internal class TestMethodCommandClass
{
    public static IEnumerable<object[]> EmptyData
    {
        get { return new object[0][]; }
    }

    public static IEnumerable<object[]> NullData
    {
        get { return null; }
    }

    public static IEnumerable<object[]> TheoryDataProperty
    {
        get { yield return new object[] { 2 }; }
    }

    [Theory, PropertyData("EmptyData")]
    public void EmptyDataTheory() { }

    [Theory, PropertyData("NullData")]
    public void NullDataTheory() { }

    [Theory, OleDbData(
        @"Provider=Microsoft.Jet.OleDb.4.0; Data Source=DataTheories\UnitTestData.xls; Extended Properties=Excel 8.0",
        "SELECT x, y, z FROM Data")]
    public void TestViaOleDb(double x,
                             string y,
                             string z) { }

    [Theory, PropertyData("TheoryDataProperty")]
    public void TestViaProperty(int x) { }

    [Theory, ExcelData(@"DataTheories\UnitTestData.xls", "SELECT x, y, z FROM Data")]
    public void TestViaXls(double x,
                           string y,
                           string z) { }

}

Для получения дополнительной информации см.:

http://www.codeplex.com/xunit

3
ответ дан 4 December 2019 в 07:36
поделиться

В то время как не строго C#, я нашел интересное использование аннотаций Java (= атрибуты C#) для маркировки присвоений студента. Каждый семестр я программирую робот маркировки для студентов, и оказывается, что студенты первого курса по некоторым причинам, кажется, не могут следовать инструкциям точно, который, конечно, заставляет робот маркировки перестать работать. Таким образом, то, что я делаю, проходят их код, находят все методы, которые не встретили спецификацию и зафиксировали их. Затем я поместил аннотацию (=attribute) на каждый из методов, которые были неправильными, говоря роботу маркировки отметить их. Это - вероятно, самый простой и прямой способ сделать это, я думаю.

8
ответ дан 4 December 2019 в 07:36
поделиться

nunit, конечно,

использованиями атрибутов гордилось кентское приветствие:

NUnit 2.0 является превосходным примером идиоматического дизайна. Большинство людей, которые портируют xUnit просто, транслитерирует версию Smalltalk или Java. Это - то, что мы сделали с NUnit сначала, также. Эта новая версия является NUnit, поскольку это было бы сделано, имел сделанный в C# для начала.

источник: http://www.nunit.org/

2
ответ дан 4 December 2019 в 07:36
поделиться

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

Конечный результат состоит в том, что я создаю свою реализацию, украшаю желаемых участников, и затем я могу запросить участников и через код и через данные, не имея необходимость делать Отражательный код в каждом случае.

1
ответ дан 4 December 2019 в 07:36
поделиться

мы используем пользовательские аннотации Java для маркировки особого назначения определенных методов, главным образом предназначенных для разработчиков:

  • @ScriptingAPI - код меток, который выставляется как часть наших сценариев API (предупреждает разработчиков, что изменения могли влиять на общедоступный API),
  • @Transaction - методы меток на фасаде базы данных, которые запускают/фиксируют транзакцию (у нас есть специализированный класс обработчика транзакций, который уважает эту аннотацию),
  • @NeedsAttentionToSupportFoo - если мы знаем, что функцией Foo является требование, чтобы мы должны были обратиться в ближайшем будущем, мы используем аннотацию для маркировки кода, которого мы должны будем коснуться для поддержки его, т.е. когда мы столкнемся с частью кода, который заставляет нас думать "ах, это должно будет быть изменено для поддержки Foo", мы аннотируем его. если реализация Foo отложена или никогда не будет происходить, легче удалить аннотацию, чем вернуться, преждевременная оптимизация рассеяла все вокруг в коде.

другое хорошее использование в качестве примера пользовательской аннотации охвачено в этой новостной рассылке для специалистов Java: осуществление общественности никакой-args конструктор во всех sub классах.

1
ответ дан 4 December 2019 в 07:36
поделиться

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

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

Каждый объект имеет некоторый 'код', и каждый объект может также иметь некоторые правила интерпретации.

В моем проекте у меня есть один класс объекта, который представляет объект, который существует в Базе данных, и, у меня также есть ряд классов 'Правила'. Один класс Правила содержит логику интерпретации данного объекта.

Для 'связывания' определенного 'Правила' (интерпретация) с определенным экземпляром моего объекта я создал пользовательский атрибут.

Я украшаю свой класс 'Правила' этим атрибутом, и через атрибут, я определяю, для которого объекта это - Правило. Затем когда я загружаю объект из DB, я ввожу корректное правило в тот объект.

Определенный код, чтобы ясно дать понять вещи:

public class MyEntity
{
    public string Code
    {
       get;
       private set;
    }

    public bool IsValidFor( ... )
    {
        IRule rule = RuleRegistry.GetRuleFor(this);

        if( rule.IsValid() ) ...
    }

}

[RuleAttrib("100")]
public class MyRule : IRule
{
    public bool IsValid()
    {
    }
}

Это - просто немного примера, но я думаю, что Вы поймаете дрейф.

Атрибут RuleAttrib на классе MyRule, говорит, что это - Правило, которое должно быть применено к экземпляру MyClass, который имеет код "100".

Экземпляр RuleRegistry может получить корректный IRule для текущего Объекта (использующий отражение).

Другим примером в том, где я использовал атрибуты, в сочетании с Пострезким, является реализация системы 'блокировки': http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

1
ответ дан 4 December 2019 в 07:36
поделиться