无法构建配置文件IEnumerable
。 Mapper.Initialize
只需要与项目中的所有配置文件一起运行一次。尝试设置profiles = new List<Profile>()
,但配置文件计数始终为0.
IEnumerable<Profile> profiles = null;
var profileType = typeof(Profile);
var assemblies = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName.Contains("Cars.Data"));
foreach (var assembly in assemblies)
{
profiles.Concat(
assembly.GetTypes()
.Where(t => profileType.IsAssignableFrom(t) &&
t.GetConstructor(Type.EmptyTypes) != null)
.Select(Activator.CreateInstance)
.Cast<Profile>());
}
Mapper.Initialize(c => profiles.ForEach(c.AddProfile));
答案 0 :(得分:7)
IEnumerable<T>
是不可变的。
.Concat()
返回带有连接序列的新IEnumerable<T>
;你忽略了这个结果。
答案 1 :(得分:2)
profiles.Concat()
会给出ArgumentNullException
。由于您将列表设置为null,因此会出现此错误。您的解决方案是使用List和AddRange方法,如下所示
List<Profile> profiles = new List<Profile>();
profiles.AddRange(assembly.GetTypes()
.Where(t => profileType.IsAssignableFrom(t) &&
t.GetConstructor(Type.EmptyTypes) != null)
.Select(Activator.CreateInstance)
.Cast<Profile>());
答案 2 :(得分:0)
作为@SLaks完美正确答案的补充,我将在此提出一个合适的LINQ解决方案。但问题本身就是OP没有分配他新建的懒惰表达式(好吧,monad)。
var profileType = typeof(Profile);
var profiles = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName.Contains("Cars.Data"))
.SelectMany(a =>
a.GetTypes()
.Where(t => profileType.IsAssignableFrom(t) &&
t.GetConstructor(Type.EmptyTypes) != null)
.Select(Activator.CreateInstance) // Have you overloaded this?
.Cast<Profile>())
.ToList(); // ToList enumerates
或者更容易阅读:
var profileType = typeof(Profile);
var profiles =
from a in AppDomain.CurrentDomain.GetAssemblies()
where a.FullName.Contains("Cars.Data")
from t in a.GetTypes()
where profileType.IsAssignableFrom(t)
and t.GetConstructor(Type.EmptyTypes) != null
select (Profile)Activator.CreateInstance; // Have you overloaded this?
var profileList = profiles.ToList(); // Enumerate if needed.
LINQ(和IEnumerable<T>
)的整个想法是不使用显式类和构造函数。