Вы не можете сделать это в компиляторе, если не считать что-то вроде добавления в fxcop.
Лучшее, что вы можете сделать, - это проверить (один раз) во время выполнения, возможно, через статический конструктор, который проверяет рассматриваемый T
и выдает ошибку для ваших модульных тестов:
public class SampleClass<TSerializable> {
static SampleClass() {
if(!Attribute.IsDefined(typeof(TSerializable),
typeof(SerializableAttribute))) {
throw new InvalidOperationException("Not [Serializable]:" +
typeof(TSerializable).Name);
}
}
}
[Serializable] class Foo { }
class Bar { }
static class Program {
static void Main() {
new SampleClass<Foo>(); // ok
new SampleClass<Bar>(); // fail
}
}