Обобщение и вывод типа - PullRequest
1 голос
/ 24 октября 2008

У меня есть абстрактный обобщенный класс BLL<T> where T : BusinessObject. Мне нужно открыть сборку, которая содержит набор конкретных классов BLL, и вернуть кортежи (businessObjectType, concreteBLLType) внутри словаря. Есть часть метода, который я мог бы использовать до сих пор, но у меня проблемы с обнаружением T.

protected override Dictionary<Type, Type> DefineBLLs()
{
   string bllsAssembly = ConfigurationManager.AppSettings["BLLsAssembly"];

   Type[] types = LoadAssembly(bllsAssembly);

   Dictionary<Type, Type> bllsTypes = new Dictionary<Type, Type>();

   foreach (Type type in types)
   {
     if (type.IsSubclassOf(typeof(BLL<>)))
        /* how to know T in the situation below? */
        bllsTypes.Add(??businessObjectType (T)??, type);
   }

   return bllsTypes;
}

Ответы [ 2 ]

3 голосов
/ 24 октября 2008

То есть конкретные классы будут закрытыми, а не общими? Вот короткая программа, которая демонстрирует то, что я думаю вы ищете ...

using System;
using System.Reflection;

public abstract class Base<T>
{
}

public class Concrete : Base<string>
{
}

class Test
{
    static void Main()
    {
        Type type = typeof(Concrete);
        Type baseType = type.BaseType;
        Type typeOfT = baseType.GetGenericArguments()[0]; // Only one arg
        Console.WriteLine(typeOfT.Name); // Prints String
    }
}

Обратите внимание, что здесь я предполагаю , что нам нужно подняться только на один уровень, чтобы добраться до соответствующего базового типа, и что конкретный класс будет закрыт. Конечно, вы хотели бы поставить больше проверок в свой реальный код, но я подозреваю, что это был вызов GetGenericArguments , который вы пропустили.

0 голосов
/ 24 октября 2008

Джон, это именно то, что я искал. Я использую основы рефлексии и дженерики, поэтому, когда требуется более глубокое знание API, чтобы противостоять обоим, я скучаю по таким вещам, спасибо за ответ.

Ваши предположения верны, конкретные классы закрыты, а T определен для базового класса (BLL).

Код стал таким:

protected override Dictionary<Type, Type> DefineBLLs()
{
   string bllsAssembly = ConfigurationManager.AppSettings["BLLsAssembly"];

   Type[] types = LoadAssembly(bllsAssembly);

   Dictionary<Type, Type> bllsTypes = new Dictionary<Type, Type>();

   foreach (Type bllType in types)
   {
     if (bllType.IsSubclassOf(typeof(BLL<>)))
     {
        Type baseType = bllType.BaseType;
        Type businessObjectType = baseType.GetGenericArguments()[0];
        bllsTypes.Add(businessObjectType, bllType);
     }
   }

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