Подтвердить что ты не робот

Можете ли вы использовать "where", чтобы требовать атрибут в С#?

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

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

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

Ответ 1

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

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

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

Ответ 2

То, что я знаю; ты не сможешь это сделать. Не могли бы вы добавить метод '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");
}

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

Ответ 3

Не бойтесь. Лучше всего выполнить проверку времени выполнения Type.IsSerializable.

Ответ 4

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