在运行时将类型传递给FirstOrDefault

时间:2010-08-09 13:12:40

标签: c# design-patterns

我有这个共同的代码:

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次:(

4 个答案:

答案 0 :(得分:3)

在不知道abcProvider.Provisions的类型的情况下,确实有点难以说明......但通常我不会向FirstOrDefault提供任何类型的参数...我只是让类型推断工作。

您是否尝试过调用:

var xyzProvider = abcProvider.Provisions.FirstOrDefault();

(它不起作用的原因是类型参数必须是类型或类型参数的名称;它们不能是在执行时计算的表达式。)

答案 1 :(得分:1)

听起来你需要为方法或包含上面代码的类提供泛型参数。以下应该正常工作(不确定如何传递提供者

public T GetStuff() {
   var xyzProvider = abcProvider.Provisions.FirstOrDefault<T>();
}

答案 2 :(得分:1)

您可能需要使用Generics。

MSDN上有几篇文章涵盖了这一点:

Generics (C# Programming Guide)

An Introduction to C# Generics

Generic Methods (C# Programming Guide)

答案 3 :(得分:0)

泛型类型的通用参数是在编译类型(非运行时)确定的。但是您希望您的代码在运行时获取FirstOrDefault的类型,从而导致错误 请尝试使用它:
private bool DoItStartup<T>(IReader reader, Type provider) {
...
var x=list.FirstOrDefault<T>();
}