Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个IEnumerable填充任意具体IEnumerable_C#_Reflection_Ienumerable - Fatal编程技术网

C# 从另一个IEnumerable填充任意具体IEnumerable

C# 从另一个IEnumerable填充任意具体IEnumerable,c#,reflection,ienumerable,C#,Reflection,Ienumerable,我正在写一些反射代码。好吧。 我有一个IEnumerablevalues对象和一个Expression表达式,表示其类型实现(但未声明为)IEnumerable的属性 e、 g.我的财产声明为: public SomeProp List{get;set;},一个values对象new[]{“a”、“bee”、“sea”},以及表达式obj=>obj.SomeProp 我已成功编写了提取信息的代码: SomeProp的IEnumerable的具体实现是List 因此,我可以对我的IEnumera

我正在写一些反射代码。好吧。
我有一个
IEnumerable
values对象和一个
Expression
表达式,表示其类型实现(但未声明为)
IEnumerable
的属性

e、 g.我的财产声明为:
public SomeProp List{get;set;}
,一个values对象
new[]{“a”、“bee”、“sea”}
,以及表达式
obj=>obj.SomeProp

我已成功编写了提取信息的代码:

SomeProp
IEnumerable
的具体实现是
List

因此,我可以对我的
IEnumerable
values对象调用
values.ToList()
,并成功地将结果分配给属性

对于
IEnumerable
的任何特定实现,我可以手动编写代码来检测该实现,并编写代码来创建满足该实现的具体对象。 事实上,我目前有一个小型映射词典,它涵盖了一些情况:

新字典
{
{typeof(List),(vals)=>vals.ToList()},
{typeof(IList),(vals)=>vals.ToList()},
{typeof(Collection),(vals)=>新集合(vals.ToList())},
{typeof(ICollection),(vals)=>新集合(vals.ToList())},
};
当然,这甚至不能涵盖大多数常见的情况,更不用说涵盖所有可能的情况了


是否有任何方法可以编写反射代码,该代码将采用任意的“值”
IEnumerable
,以及目标具体的
IEnumerable
,并从这些值创建具体的实例?


这似乎有点乐观,但我觉得值得一问:)

TL;DR:在一般情况下,这是不可能的。最后,这只是接口不可直接构造的问题

在.NET framework类型中

如果您的目标类型确实是一个具体的类型,如
列表
集合
,则可以从其
类型
对象中创建一个实例。您仍然必须假设存在一个构造函数,它接受
IEnumerable
作为第一个也是唯一的参数。即使使用常见的框架类型,情况也并非如此:

Type[]types={typeof(List)、typeof(IList)、typeof(Collection)、typeof(ICollection)};
IEnumerable values=新列表{/*…*/};
foreach(类型中的变量类型){
var-concreteInstance=type.GetConstructor(新类型[]{typeof(IEnumerable)})?.Invoke(新对象[]{values});
//为列表成功。
//IList作为非具体类型失败。
//集合失败,因为没有构造函数接受IEnumerable作为第一个参数。
//ICollection失败,因为它不是具体类型。
}
一般情况

让我们定义以下接口:

接口IArbitrary:IEnumerable{}

事实上,到目前为止还没有这个接口的具体实现。因此,无论您如何努力,从一个
IEnumerable
创建一个“目标具体
iBitrary
”都不可能使用反射代码。

问题是,如果不可能,您想做什么?因为在某些情况下,接口没有任何具体的实现。@CorentPane这听起来很有趣,如果它存在的话,但我不明白你为什么认为它存在?你能举一个没有具体实现的接口的例子吗?@jdweng我不知道你想回答什么问题。。。但这肯定不是这个问题的答案。除了别的。。。我们只有1个
IEnumerable
对象,我们对它包含的对象一无所知。@monica--Brondahl--I可以创建一个接口
IArbitrary:IEnumerable
,它没有任何具体的实现。如果尝试在其后面创建“target concrete
IEnumerable
”,会发生什么?另外,您假设这个具体类型可以从一个
IEnumerable
构造,那么如果不是这样呢?@corentpane哦。。。是 啊你当然可以。(我只是从.NET framework类型的角度考虑,在这种情况下,这样的接口将不存在,因为它将毫无意义)很酷。我认为这很典型地证明了这项任务一定是不可能的。