根据参数

时间:2018-01-25 13:22:24

标签: c# .net linq generics odata

我使用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;

如何动态选择集合并查询它?

1 个答案:

答案 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;