C# 如何建立一个IEnumerable?

C# 如何建立一个IEnumerable?,c#,collections,C#,Collections,无法建立配置文件IEnumerable。初始化只需要在项目中的所有配置文件中运行一次。尝试设置profiles=新列表,但profiles计数始终为0 IEnumerable<Profile> profiles = null; var profileType = typeof(Profile); var assemblies = AppDomain.CurrentDomain.GetAssemblies() .Where(a => a.FullName.Contains

无法建立配置文件IEnumerable。初始化只需要在项目中的所有配置文件中运行一次。尝试设置profiles=新列表,但profiles计数始终为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));
IEnumerable是不可变的

.Concat返回带有连接序列的新IEnumerable;您正在忽略此结果。

与null一起使用时,会给出ArgumentNullException。由于您将列表设置为null,因此将出现此错误。您的解决方案是使用列表和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>());

作为@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

LINQ和IEnumerable的全部思想是不使用显式类和构造函数。

始终解释哪些不起作用,特别是。它本身不起作用对我们来说意义不大。你不是从profiles.Concat中得到了一个ArgumentNullException吗?不允许使用空对象连接。如果这是你的问题,为什么不把它列成一个列表并使用.addRange呢?这很好,但这并不能回答问题。@O.O,是的,它回答了问题。除了你的第一个NullPointerException之外,我要寻找的答案是让我的代码工作的答案,而不是字典里的答案。哈里森走对了。@O.O Ie IEnumerable是不可变的。老实说,你没有研究你的问题。我没有问IEnumerable是否是不变的。我问如何建立一个。答案是使用列表。老实说,你研究过这个问题吗?啊,对。我不知道列表是可数的。应该使用列表。顺便说一句:把你的答案改成第一行的新答案。
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.