0

无法建立配置文件IEnumerableMapper.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));
4

3 回答 3

7

IEnumerable<T>是不可变的。

.Concat()返回一个IEnumerable<T>带有连接序列的新的;你忽略了这个结果。

于 2013-11-05T17:16:18.170 回答
2

profiles.Concat()ArgumentNullException与 null 一起使用时 给出。由于您将列表设置为 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>());
于 2013-11-05T17:21:49.483 回答
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>是不使用显式类和构造函数。

于 2013-11-05T18:41:23.793 回答