Я хочу создать общий класс, который принимает только сериализуемые классы, можно ли это сделать с ограничением where?
Я ищу такую концепцию:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]





Боюсь, что нет. Единственное, что вы можете делать с ограничениями:
where T : class - T должен быть ссылочным типомwhere T : struct - T должен быть типом значения, не допускающим значения NULL.where T : SomeClass - T должен быть SomeClass или производным от негоwhere T : ISomeInterface - T должен быть ISomeInterface или реализовывать егоwhere T : new() - T должен иметь общедоступный конструктор без параметровВозможны различные комбинации, но не все. Ничего об атрибутах.
@ user457104: Это не приведет к принудительному применению атрибута, нет.
Не боюсь. Лучшее, что вы можете сделать, - это проверить Тип.IsSerializable во время выполнения.
Что я знаю; ты не сможешь это сделать. Вы когда-нибудь задумывались о добавлении метода «инициализации» или чего-то подобного?
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");
}
Я не тестировал этот код, но надеюсь, что вы поняли мою мысль.
Если вы собираетесь провести тест во время выполнения, метод IsDefined проще: msdn.microsoft.com/en-us/library/…
Да, у меня была проверка времени выполнения, но я хотел использовать ограничение where. Все равно спасибо за ответ
Джон: Вы абсолютно правы насчет этого. Не знаю, как я пропустил метод IsDefined, но спасибо, что указали на него!
Если вы ищете какой-либо класс, который можно сериализовать, я думаю, вам не повезло. Если вы ищете созданные вами объекты, вы можете создать сериализуемый базовый класс, на основе которого будут производиться все классы, которые вы хотите поддерживать.
Я знаю, что это старый, но я использую для проверки статический конструктор. Это позже, но позволяет вам выдать ошибку во время выполнения.
where T : ISerializableне сделал бы этого?