Получение «базового» типа данных, а не странного обнуляемого, с помощью отражения в c # - PullRequest
2 голосов
/ 03 марта 2011

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

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

{Name = "Nullable 1" FullName = "System.Nullable 1 [[System.Decimal, mscorlib, Версия = 4.0.0.0, Культура = нейтральный, 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

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

Большое спасибо всем.

Ответы [ 2 ]

7 голосов
/ 03 марта 2011
private static Type GetCoreType(Type type)
{
    if (type.IsGenericType &&
        type.GetGenericTypeDefinition() == typeof(Nullable<>))
        return Nullable.GetUnderlyingType(type);
    else
        return type;
}
2 голосов
/ 03 марта 2011

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

        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;
        }
...