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 concreteIEnumerable
”,会发生什么?另外,您假设这个具体类型可以从一个IEnumerable
构造,那么如果不是这样呢?@corentpane哦。。。是 啊你当然可以。(我只是从.NET framework类型的角度考虑,在这种情况下,这样的接口将不存在,因为它将毫无意义)很酷。我认为这很典型地证明了这项任务一定是不可能的。