2010-08-09 30 views
1

我有这样的常用代码:在运行时传递一个类型FirstOrDefault

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

回答

3

不知道这是一个有点很难说肯定的abcProvider.Provisions类型...但通常我不提供任何类型参数FirstOrDefault。 ..我只是让类型推断工作

您是否尝试过只是打电话:?

var xyzProvider = abcProvider.Provisions.FirstOrDefault(); 

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

+0

我想知道为什么这实际上不起作用。 (如果它实际上不能满足他的需求) 如果这不起作用,那么为提供者提供一个整体接口可能是更好的解决方案。但我肯定想从这里开始。 – Rangoric 2010-08-09 13:22:31

1

听起来好像您需要为包含上面代码的方法或类提供一个通用参数。以下应正常工作(不知道如何提供商正在传递

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

通用类型的通用参数是在编译类型(不是运行时)下确定的。但是你希望你的代码在运行时得到FirstOrDefault类型,这会导致错误。
尝试使用此代替:
private bool DoItStartup<T>(IReader reader, Type provider) {
...
var x=list.FirstOrDefault<T>();
}