我有一个抽象的泛型类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;
}
答案 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)
您的假设是正确的,具体类是关闭的,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;
}