Можете ли вы использовать «где», чтобы запросить атрибут в C#?

StackOverflow https://stackoverflow.com/questions/221687

Вопрос

Я хочу создать универсальный класс, который принимает только сериализуемые классы. Можно ли это сделать с помощью ограничения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 .

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

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

scroll top