2013-01-03 136 views
4

標題相當混亂。我會嘗試用一個例子來解釋。考慮下面的代碼:如何在使用通用類型時指定匿名類型的類型

String[] str={"Apple","Banana","Cherry","Orange"}; 
var anoCollection=from e in str select new 
             { 
              ch=e[0], 
              length=e.Length 
             } 
dataGridView.DataSource=anoCollection.ToList(); //TypeInitializationException 

我覺得我必須要提到在上述情況下類型爲ToList<T>()方法。但是我怎麼能在這裏提到一個匿名類型?

+1

@TimSchmelter實際上,在許多情況下,'.ToList()'版本更可取,尤其是在winforms中 - 它需要一個'IList',而一個*序列*將不起作用 –

+1

TypeInitializationException帶有一個InnerException; * *表示什麼?這告訴你實際的問題是什麼。 –

+0

@MichaelPerrenoud這肯定是一個相關的話題,但我不認爲這是在這裏解決問題 –

回答

3

這是從來沒有可能直接提到一個匿名類型,但你不應該需要。泛型類型推斷意味着你不需要在.ToList<T>()中指定<T> - 編譯器會自動注入發明的類型。

只有引用匿名類型的幾種方法:

    通過 someObj.GetType()
  • ,其中someObj是一個匿名類型通過泛型
  • 的實例,爲T,通過調用一個泛型方法經由通用類型推斷(如在ToList())反射的
  • 各種其他用途,經由GetGenericTypeParameters()
T
0

這可能不是你所要求的是什麼,但如果你以後想使用DataBoundItem一排,你可以這樣說:與支持這種方法的

var item = TypeExtensions.CastByPrototype(row.DataBoundItem, new { ch = 'a', length = 0}); 
//you can use item.ch and item.length here 
Trace.WriteLine(item.ch); 

public static class TypeExtensions 
{ 
    public static T CastByPrototype<T>(object obj, T prototype) 
    { 
     return (T)obj; 
    } 
} 
+0

通過將其設置爲擴展方法並將其命名爲CastToTypeOf,可以使其更具可讀性。所以這一切都是這樣的:'row.DataBoundItem.CastToTypeOf(new {ch ='a',length = 0})'。 – nawfal