Можете ли вы использовать "where", чтобы требовать атрибут в С#?
Я хочу создать универсальный класс, который принимает только сериализуемые классы, может ли это быть сделано с помощью ограничения where?
Концепция, которую я ищу, такова:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
Ответы
Ответ 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
Если вы ищете любой сериализуемый класс, я думаю, вам не повезло. Если вы ищете объекты, которые вы создали, вы можете создать базовый класс, который может быть сериализуемым и иметь каждый класс, который вы хотите поддержать, из него.