Получение `` базового '' типа данных вместо странного, допускающего значение NULL, через отражение в c #

Моя основная потребность - получить типы данных из анонимного типа, сгенерированного из запроса LINQ to SQL.

У меня есть фрагмент кода (более умный, чем я мог бы написать, поскольку я особо не углублялся в рефлексию), который возвращает типы данных из анонимных типов и отлично работает для элементов, помеченных как «не допускающие значения NULL» в свойствах linq2sql. Итак, если у меня есть строка, она вернется как System.String. Однако, когда элемент имеет значение NULL, я получаю его полное имя:

{Name = "Nullable1" FullName = "System.Nullable1 [[System.Decimal, mscorlib, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089]]"}

Все, что я хочу извлечь, - это тип System.Decimal в таком случае (а в случае строк или чего-то еще мне просто нужен System.String). Я просмотрел свойства и не нашел ничего, что могло бы это сохранить.

    private static Dictionary<string, Type> GetFieldsForType<T>(IEnumerable<T> data)
    {
        object o = data.First();

        var properties = o.GetType().GetProperties();

        return properties.ToDictionary(property => property.Name, property => property.PropertyType);
    }

Запрос LINQ (который, я думаю, здесь не имеет большого значения):

var theData = from r in db.tblTestEdits select new { myitem = r.textField, mydecimal = r.decimalField }; 

Я нашел эту ссылку, которая, похоже, пытается решить похожую проблему.
http://ysgitdiary.blogspot.com/2010/02/blog-post.html

Хотя кажется, что он возвращает «строку» типа, а не фактического типа, что мне и нужно. Не знаю, как преобразовать такую ​​вещь.

Всем огромное спасибо.


person Glinkot    schedule 02.03.2011    source источник


Ответы (2)


Вы хотите что-то вроде этого, может быть

        Type targetType;
        bool isNullable;

        // Do we have a nullable type?
        if (type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
        {
            isNullable = true;
            targetType = type.GetGenericArguments()[0];
        }
        else
        {
            isNullable = false;
            targetType = type;
        }
person James Gaunt    schedule 02.03.2011
comment
Привет, Джеймс, я подумал, что должен начать с первого ответа и работать дальше, и тот, что ниже, отлично справился с задачей. Я тоже сохраню этот фрагмент, спасибо за вашу помощь! - person Glinkot; 03.03.2011

person    schedule
comment
Фантастика! Очень признателен mquander! Интересно, что когда я смотрел на «базовые» свойства в инспекторе свойств, они все еще оставались огромными текстовыми блоками. Очень признателен. - person Glinkot; 03.03.2011
comment
Инспектор объектов отладчика обычно должен преобразовывать все в текст, чтобы отобразить его вам, и лучший способ, которым он знает, как выразить универсальный тип, допускающий значение NULL, в виде текста - это большой кусок дерьма. - person mqp; 03.03.2011