Можете ли вы использовать "где", чтобы требовать атрибут в C #? - PullRequest
31 голосов
/ 21 октября 2008

Я хочу создать универсальный класс, который принимает только сериализуемые классы. Можно ли это сделать с помощью ограничения where?

Концепция, которую я ищу, такова:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]

Ответы [ 5 ]

37 голосов
/ 21 октября 2008

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

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

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

7 голосов
/ 21 октября 2008

Что я знаю; ты не сможешь это сделать. Хотели ли вы добавить метод «Initialize» или что-то подобное?

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");
}

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

4 голосов
/ 21 октября 2008

Не бойся. Лучшее, что вы можете сделать - это проверка во время выполнения на Type.IsSerializable .

0 голосов
/ 25 января 2018

Я знаю, что это старый, но я использую статический конструктор для проверки. Это позже, но позволяет вам выдать ошибку во время выполнения.

0 голосов
/ 21 октября 2008

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

...