泛型和类型推断

时间:2008-10-24 11:59:38

标签: c# generics reflection

我有一个抽象的泛型类BLL<T> where T : BusinessObject。我需要打开一个包含一组具体BLL类的程序集,并在Dictionary中返回元组(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 个答案:

答案 0 :(得分:3)

那么具体的类将被关闭而不是通用的?这是一个简短的程序,演示了我认为你在追求什么......

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的调用。

答案 1 :(得分: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;
}