我正在写一些反射代码。呃,好吧。
IEnumerable<TData>
值对象,和一个Expression<Func<TInstance, IEnumerable<TData>>>
,代表一个其类型实现(但不是declared as)IEnumerable<TData>
的属性。例如我有一个属性声明为:public SomeProp List<String> {get;set;}
,值对象new[] {"a", "bee", "sea"}
和表达式obj => obj.SomeProp
我已经成功编写了提取信息的代码:
IEnumerable<>
的SomeProp
的具体实现是List<>
因此,我可以在values.ToList()
值对象上调用IEnumerable<string>
并将结果成功分配给属性。
对于IEnumerable<>
的任何特定实现,我可以手动编写代码以检测该实现,并创建一个满足要求的具体对象。确实,我目前有一个小的映射字典,它涵盖了一些情况:
new Dictionary<Type, Func<IEnumerable<TProp>, IEnumerable<TProp>>>
{
{ typeof(List<>), (vals) => vals.ToList() },
{ typeof(IList<>), (vals) => vals.ToList() },
{ typeof(Collection<>), (vals) => new Collection<TProp>(vals.ToList()) },
{ typeof(ICollection<>), (vals) => new Collection<TProp>(vals.ToList()) },
};
自然,这甚至不包括大多数common案例,更不用说涵盖所有可能的案例了!
有什么方法可以编写将采用任意“值” IEnumerable<T>
和目标具体对象IEnumerable<T>
,并根据这些值创建具体实例的反射代码?
似乎有点乐观,但我认为值得一问:)
TL; DR: