通过c#中的反射获得'基本'数据类型而不是奇怪的可空类型

时间:2011-03-02 22:39:14

标签: c# reflection types anonymous-types

我的基本需求是从LINQ to SQL查询生成的匿名类型中获取数据类型。

我有一段代码(比我写的更聪明,因为我还没有深入研究过反射)从匿名类型返回数据类型,并且对于linq2sql属性中标记为'not nullable'的元素非常有效。所以,如果我有一个字符串,它将作为System.String返回。但是,当元素可以为空时,我最终会得到它的“全名”:

{Name =“Nullable 1" FullName = "System.Nullable 1 [[System.Decimal,mscorlib,Version = 4.0.0.0,Culture = neutral,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 个答案:

答案 0 :(得分:7)

private static Type GetCoreType(Type type)
{
    if (type.IsGenericType &&
        type.GetGenericTypeDefinition() == typeof(Nullable<>))
        return Nullable.GetUnderlyingType(type);
    else
        return type;
}

答案 1 :(得分: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;
        }