如何在使用泛型类型时指定匿名类型的类型

时间:2013-01-03 13:20:02

标签: c# .net linq anonymous-types typeinitializeexception

标题非常令人困惑。我将尝试用一个例子来解释。请考虑以下代码:

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

2 个答案:

答案 0 :(得分:3)

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

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

  • 通过someObj.GetType(),其中someObj是匿名类型的实例
  • 通过泛型,作为T,通过泛型类型推断调用泛型方法(如ToList()中所述)
  • 反思的各种其他用法,通过T
  • 提取GetGenericTypeParameters()

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