asp.net c # отражение, создавая больше экземпляров, чем ожидалось - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть вспомогательный метод здесь, в классе. Он возвращает все экземпляры данного интерфейса во всех библиотеках домена приложения.

public static class Helper
{
  public static List<T> GetOfType<T> ()
  {
    var t =  from asm in AppDomain.CurrentDomain.GetAssemblies()
                  from type in asm.GetTypes()
                  where !type.IsInterface && !type.IsAbstract && typeof(T).IsAssignableFrom(type)
                  select (T)Activator.CreateInstance(type);
   return t.List();
 }
}

Редактировать

Теперь скажите, что у меня есть интерфейс

IUserContent
{
  string URL {get;set;}

 }

и реализация скажем PhotoContent

public class PhotoContent
{
     public string URL {get;set]}
}

теперь, когда я говорю

var c = Helper.GetOfType<IUserContent>();

Это дает мне 9 экземпляров IUserContent, все указывающие на фотоконтент

В этом проблема. Я не мог понять, в чем причина.

Может ли кто-нибудь помочь здесь.

С уважением Parminder

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011

У вас есть два предложения from в вашем запросе LINQ. Может быть, это приводит к тому, что результаты будут возвращаться несколько раз? Я бы попробовал использовать SelectMany вместо:

var t = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(a => a.GetTypes())
    .Where(type => !type.IsInterface && !type.IsAbstract && typeof(T).IsAssignableFrom(type))
    .Select(type => (T)Activator.CreateInstance(type));
0 голосов
/ 28 сентября 2011

Первое, что нужно сделать, это получить полное имя:

foreach(var obj in c) {
    Console.WriteLine(c.GetType().AssemblyQualifiedName);
}

, который дает вам полные имена типов (включая сборки) для задействованных типов. Мое предположение будет означать, что тип был случайно объявлен в нескольких сборках или пространствах имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...