我使用OData Connected Service来使用OData。在我的端点中,有很多集合,所以为了避免使用意大利面条代码,我想我会用一个参数来执行我的代码,该参数可以告诉我使用哪个集合。
这是我为单一收集所做的代码片段:
var ctx = new ODataService(new Uri("http://urlofodataendpoint/OData/"));
ctx.Credentials = System.Net.CredentialCache.DefaultCredentials;
ctx.Format.UseJson();
var query = from f in ctx.Files
select new File
{
Title = f.Title
};
DataServiceCollection<File> files = new DataServiceCollection<File>(query);
while (files.Continuation != null)
files.Load(ctx.Execute(files.Continuation));
foreach (var f in files)
{
//do something for each File
}
在这种情况下,Files是File类型的集合。我想为每个集合执行此代码。当然,每个系列都有不同的类型。 这就是我的尝试:
string nameOfCollection = "Files";
var ctx = new ODataService(new Uri("https://urlofodataendpoint/OData/"));
ctx.Credentials = new System.Net.CredentialCache.DefaultCredentials;
ctx.Format.UseJson();
dynamic type = ctx.Links;
PropertyInfo[] PI = ctx.GetType().GetProperties();
for(int i=0; i<PI.Count();i++)
{
if (PI[i].Name == nameOfCollection )
type = PI[i];
}
Console.WriteLine(type);
//Type itemtype = type.GetType().GetGenericArguments().Single();
var query = from f in ((IEnumerable<Type>)type).Cast<dynamic>()
select f;
DataServiceCollection <dynamic> files = new DataServiceCollection<File>(query);
while (files.Continuation != null)
files.Load(ctx.Execute(files.Continuation));
不幸的是
var query = from f in ((IEnumerable<Type>)type).Cast<dynamic>()
select f;
部分失败
System.InvalidCastException:&#39;无法转换类型的对象 &#39; System.Reflection.RuntimePropertyInfo&#39;输入 &#39; System.Collections.Generic.IEnumerable`1 [System.Type的]&#39;&#39;
我想分配DataServiceCollection时的部分也不起作用:
错误CS1503参数1:无法转换 &#39; System.Collections.Generic.IEnumerable&#39;至 &#39; System.Collections.Generic.IEnumerable&#39;
如何动态选择集合并查询它?
答案 0 :(得分:0)
当您尝试将变量类型转换为IEnumerable<Type>
时,您获得了无效的转换。
考虑更改此代码:
var query = from f in ((IEnumerable<Type>)type).Cast<dynamic>()
select f;
为:
var query = from f in ((IEnumerable)type.GetValue(ctx)).Cast<dynamic>()
select f;