Можно ли использовать, “где” потребовать атрибута в c#?

ptr++

ptr не указывает на элемент массива, поэтому после его увеличения он становится недействительным - даже если в этом адресе есть другой объект. Когда вы проходите через него косвенно, поведение программы не определено.

Что вам действительно нужно для итерации членов класса, так это языковая функция, называемая «отражение». C ++ имеет очень ограниченную поддержку для отражения. Вы можете хранить ссылки на элементы в массиве и выполнять итерацию массива. Обратите внимание, что, поскольку у нас не может быть массивов ссылок, нам нужно обернуть их, а в случае printf явно преобразовать оболочку обратно:

std::array members {
    std::ref(finstr.union1.testint1),
    std::ref(finstr.union2.testint2),
};
auto ptr = std::begin(members);

printf("val: %i addr: %p\n", ptr->get(), (void*)&ptr->get());
ptr++;
printf("val: %i addr: %p\n", ptr->get(), (void*)&ptr->get());

P.S. Я позволил себе зафиксировать printf звонок. %x неверно для указателя.

32
задан juan 21 October 2008 в 12:45
поделиться

4 ответа

Нет, я боюсь нет. Единственные вещи, которые можно сделать с ограничениями:

  • where T : class - T должен быть ссылочным типом
  • where T : struct - T, должен быть не допускающий NULL-значения тип
  • where T : SomeClass - T значения, должен быть SomeClass или произойти из него
  • where T : ISomeInterface - T, должен быть ISomeInterface или реализовать, он
  • where T : new() - T должен иметь общедоступного конструктора без параметров

, Различные комбинации выполнимы, но не все. Ничто об атрибутах.

38
ответ дан 27 November 2019 в 20:56
поделиться

Что я знаю; Вы не можете сделать этого. Вы имеете хотя о добавлении 'Инициализировать' метода или чего-то подобного?

public void Initialize<T>(T obj)
{
     object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
     if(attributes == null || attributes.Length == 0)
          throw new InvalidOperationException("The provided object is not serializable");
}

я не протестировал этот код, но я надеюсь, что Вы понимаете мою мысль.

7
ответ дан 27 November 2019 в 20:56
поделиться

Боящийся нет. Лучше всего можно сделать, проверка на этапе выполнения на Тип. IsSerializable.

4
ответ дан 27 November 2019 в 20:56
поделиться

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

0
ответ дан 27 November 2019 в 20:56
поделиться
Другие вопросы по тегам:

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