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>()方法的类型。但是我怎么能在这里提到匿名类型呢?

4

2 回答 2

3

永远不可能直接提及匿名类型,但您不应该这样做。泛型类型推断意味着您不需要指定<T>in .ToList<T>()- 编译器会自动注入发明的类型。

只有几种方法可以引用匿名类型:

  • via someObj.GetType(),其中someObj是匿名类型的实例
  • 通过泛型,作为 a T,通过泛型类型推断调用泛型方法(如 中ToList()
  • 反射的各种其他用途,拉入T通孔GetGenericTypeParameters()
于 2013-01-03T13:23:41.677 回答
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;
    }
}
于 2013-01-03T13:32:02.587 回答