2011-03-02 181 views
2

我的基本需求是從LINQ to SQL查詢生成的匿名類型中獲取數據類型。通過c#中的反射獲取「基本」數據類型而不是奇怪的數據類型

我有一段代碼(比我能寫的更聰明,因爲我沒有真正鑽研反射),它從匿名類型返回數據類型,並且完美適用於linq2sql中標記爲「不可空」的元素屬性。所以,如果我有一個字符串,它將返回爲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

雖然它似乎返回類型的「字符串」,而不是實際的類型,這是我所需要的。不知道如何轉換這樣的事情。

非常感謝所有。

回答

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

太棒了!非常感謝mquander!有趣的是,當我在查看屬性檢查器中的「基礎」屬性時,他們仍然是這些巨大的文本塊。非常感激。 – Glinkot 2011-03-02 23:20:56

+0

調試器的對象檢查器通常需要將所有內容都轉換爲文本以顯示給你,並且它知道如何表達一個通用可爲空類型的最好方式,因爲文本就是一大堆垃圾。 – mquander 2011-03-02 23:34:28

+0

看起來非常真實! – Glinkot 2011-03-04 04:29:10

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; 
     } 
+0

嗨,詹姆斯,我想我應該從第一個答案開始,並努力工作,下面的答案很好。儘管如此,我也會保留這段代碼,謝謝你的幫助! – Glinkot 2011-03-02 23:22:02

+0

沒問題。祝你好運。 – 2011-03-03 09:13:02

相關問題