Проверка общего типа

Есть ли способ принудительного применения / ограничения типов, передаваемых примитивам? (bool, int, string и т. д.)

Теперь я знаю, что вы можете ограничить универсальный параметр типа реализацией типа или интерфейса черезгде пункт. Тем не менее, это не соответствует требованиям для примитивов (AFAIK), потому что они не все имеют общую почву (кромеобъект прежде чем кто-то скажет! :П).

Итак, мои нынешние мысли просто стиснуть зубы и сделать большойпереключатель Заявление и броситьArgumentException на провал ..

РЕДАКТИРОВАТЬ 1:

Просто для ясности:

Определение кода должно быть таким:

public class MyClass<GenericType> ....

И экземпляр:

MyClass<bool> = new MyClass<bool>(); // Legal
MyClass<string> = new MyClass<string>(); // Legal
MyClass<DataSet> = new MyClass<DataSet>(); // Illegal
MyClass<RobsFunkyHat> = new MyClass<RobsFunkyHat>(); // Illegal (but looks awesome!)

РЕДАКТИРОВАТЬ 2

@Jon Limjap - Хороший вопрос, и кое-что, что я уже рассматривал .. Я уверен, что есть универсальный метод, который можно использовать, чтобы определить, является ли тип значением или ссылочным типом.

Это может быть полезно для мгновенного удаления множества объектов, с которыми я не хочу иметь дело (но тогда вам нужно беспокоиться об используемых структурах, таких какРазмер ) .. Интересной проблемы нет? :)

Вот:

where T : struct

Взято изMSDN.

Мне любопытно .. Может ли это быть сделано в .NET 3.x с использованием методов расширения? Создайте интерфейс и реализуйте интерфейс в методах расширения (которые, вероятно, будут чище, чем немного жирный переключатель). Кроме того, если впоследствии вам потребуется расширить на любые легковесные пользовательские типы, они также могут реализовать тот же интерфейс без изменений в базовом коде.

Что вы ребята думаете?

Печальная новость - я работаю в Framework 2 !! : D

РЕДАКТИРОВАТЬ 3

Это было так просто послеДжон Лимджапс Пойнтер.. Так просто, что я почти хочу плакать, но это здорово, потому что код работает как шарм!

Итак, вот что я сделал (вы будете смеяться!):

Код добавлен в общий класс
bool TypeValid()
{
    // Get the TypeCode from the Primitive Type
    TypeCode code = Type.GetTypeCode(typeof(PrimitiveDataType));

    // All of the TypeCode Enumeration refer Primitive Types
    // with the exception of Object and Empty (Null).
    // Since I am willing to allow Null Types (at this time)
    // all we need to check for is Object!
    switch (code)
    {
        case TypeCode.Object:
            return false;
        default:
            return true;
    }
}

Затем небольшой вспомогательный метод для проверки типа и выдачи исключения,

private void EnforcePrimitiveType()
{
    if (!TypeValid())
        throw new InvalidOperationException(
            "Unable to Instantiate SimpleMetadata based on the Generic Type of '" + typeof(PrimitiveDataType).Name + 
            "' - this Class is Designed to Work with Primitive Data Types Only.");
}

Все, что нужно сделать, это позвонитьEnforcePrimitiveType () в классах конструкторы. Дело сделано! :-)

Единственный недостаток, он генерирует исключение только во время выполнения (очевидно), а не во время разработки. Но это не имеет большого значения и может быть подхвачено такими утилитами, какFxCop (который мы не используем на работе).

Отдельное спасибо Джону Лимджапу за это!

Ответы на вопрос(8)

Ваш ответ на вопрос