2008-10-24 3 views
1

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

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; 
} 
+0

Ну, что же T относится к здесь? Непонятно (по крайней мере, мне), что представляет собой код. – 2008-10-24 12:03:27

+0

Я думаю, что Джон, вероятно, очистил код для вас. – 2008-10-24 12:25:21

ответ

3

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

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

Джон, это именно то, что я искал. Я использую основы рефлексии и дженериков, поэтому, когда требуется более глубокое знание 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; 
} 
Смежные вопросы