我有这个共同的代码:
private bool DoItStartup(IReader reader, Type provider)
{
/// lots of common boiler plate code
/// like:
var abcProvider = reader.ReaderData as AbcProvider;
var xyzProvider = abcProvider.Provisions.FirstOrDefault<XyzProvider>(); // line 2
}
以上几行代码适用于50或某些提供商,现在第2行我想基本上这样做:
var xyzProvider = abcProvider.Provisions.FirstOrDefault<typeOf(provider)>();
这不起作用,可能是因为xyzProvider
不知道它的类型@编译时间?不确定。但是我可以使用类似的模式吗?否则,我不得不复制这个重要代码50次:(
答案 0 :(得分:3)
在不知道abcProvider.Provisions
的类型的情况下,确实有点难以说明......但通常我不会向FirstOrDefault
提供任何类型的参数...我只是让类型推断工作。
您是否尝试过调用:
var xyzProvider = abcProvider.Provisions.FirstOrDefault();
(它不起作用的原因是类型参数必须是类型或类型参数的名称;它们不能是在执行时计算的表达式。)
答案 1 :(得分:1)
听起来你需要为方法或包含上面代码的类提供泛型参数。以下应该正常工作(不确定如何传递提供者
public T GetStuff() {
var xyzProvider = abcProvider.Provisions.FirstOrDefault<T>();
}
答案 2 :(得分:1)
答案 3 :(得分:0)
泛型类型的通用参数是在编译类型(非运行时)确定的。但是您希望您的代码在运行时获取FirstOrDefault的类型,从而导致错误
请尝试使用它:
private bool DoItStartup<T>(IReader reader, Type provider)
{
...
var x=list.FirstOrDefault<T>();
}