C#泛型:泛型类型推断失败意味着我无法使用匿名类型
||
我有一个Exporter类,该类具有一个通用方法,该方法接受ѭ0并通过使用反射枚举其属性值来创建导出文档:
public class Exporter
{
public string Export<T>(IEnumerable<T> enumerable)
{
//Implementation omitted
}
}
由于通用类型推断,我可以为其提供匿名集合类型。请注意,下面的方法调用中没有通用参数:
string fooString =
new Exporter().Export(new List<Foo>()
{
new Foo() {Name = \"cats\", NumberOfHams = 1},
new Foo() {Name = \"dogs\", NumberOfHams = 8}
}
.Select(x => new { TwiceTheHams = x.NumberOfHams * 2 }));
我们都喜欢C#3。但是,我想修改此类,以便可以输入有关导出文档中列的更多信息,例如宽度。
我在导出类中创建了一个新方法,如下所示:
public string Export<T>(IEnumerable<T> enumerable, IEnumerable<ColumnDetails<T>> columnDetails)
{
//Implementation omitted
}
理想的语法是这样的,其中where4ѭ是of5ѭ类型:
fooString = new Exporter().Export(foos,
new List<ColumnDetails<Foo>>
{
new ColumnDetails<Foo>(x => x.Name, 12),
new ColumnDetails<Foo>(x => x.NumberOfHams, 4),
});
但是,当我如上所述调用新的Export()
重载时,泛型类型推断似乎不够聪明,无法推断出ColumnDetails<T>
的泛型参数T
应该与IEnumerable
的泛型参数T
相同。这意味着我必须指定“ 12”作为参数,因此我不能将其与匿名集合一起使用。
我真的是泛型和类型推断的新手。我想做的事可能吗?我需要以某种方式重组代码吗?
编辑:这是我不能做的,因为Visual Studio需要ColumnDetails的通用参数,而我没有:
fooString = new Exporter().Export(foos.Select(x => new {TwiceTheHams = x.NumberOfHams * 2}),
new List<ColumnDetails>
{
new ColumnDetails(x => x.TwiceTheHams, 12)
});
没有找到相关结果
已邀请:
3 个回复
朗排谎纷瘟
使您具有引用
,而
中的
使编译器推断T是什么类型,从而允许您将匿名类型的对象构造为
的值。
蹄渭信妥扳
播匣扦阔食
吗? 在我看来,您需要一个通用的辅助函数,该函数将使用
参数并从中构造construct23ѭ对象的列表。然后插入对该函数的调用,作为“ 24”的第二个参数。