Можете ли вы использовать «где», чтобы запросить атрибут в C#?
-
03-07-2019 - |
Вопрос
Я хочу создать универсальный класс, который принимает только сериализуемые классы. Можно ли это сделать с помощью ограничения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 должен иметь общедоступный конструктор без параметров.
Возможны различные комбинации, но не все.Ничего об атрибутах.
Другие советы
Что я знаю; ты не сможешь это сделать. Задумывались ли вы о добавлении метода «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");
}
Я не тестировал этот код, но надеюсь, что вы поняли мою точку зрения.
Не бойся. Лучшее, что вы можете сделать, - это проверить во время выполнения Type.IsSerializable а>. р>
Если вы ищете какой-либо сериализуемый класс, я думаю, вам не повезло. Если вы ищете объекты, которые вы создали, вы можете создать базовый класс, который можно сериализовать, и иметь для него каждый класс, который вы хотите поддерживать.
Я знаю, что это старый, но я использую статический конструктор для проверки. Это позже, но позволяет вам выдавать ошибку во время выполнения.