Как указать универсальный тип должен быть помечен с атрибутом? - PullRequest
1 голос
/ 01 декабря 2009

Я знаю, что могу:

public class SampleClass<TSerializable>
    where TSerializable : ISerializable

Как я могу написать SampleClass, который принимает только классы, отмеченные вместо SerializableAttribute?

1 Ответ

3 голосов
/ 01 декабря 2009

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