0

プロファイルの作成に問題があるIEnumerableMapper.Initializeプロジェクト内のすべてのプロファイルで 1 回だけ実行する必要があります。を設定しようとし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>連結されたシーケンスで new を返します。あなたはこの結果を無視しています。

于 2013-11-05T17:16:18.170 に答える
2

profiles.Concat()ArgumentNullExceptionnull で使用すると を返します 。リストを 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が彼の新しく構築された遅延式(まあ、モナド)を割り当てなかったことです。

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 に答える