如何判断两个泛型的 "开放" 类型 是否为继承关系
判断两个类型是否为继承关系 一般使用 Type 的 IsAssignableFrom 方法Console.WriteLine(typeof(IList<string>).IsAssignableFrom(typeof(List<string>)));//true
Console.WriteLine(typeof(IList<>).IsAssignableFrom(typeof(List<>))); //false
现在我想判断的就是 typeof(TBase<>) 和 (typeof(TSub<>) 这样 “开放”类型的关系
原本的思路为 通过判断 这两个类型的 “封闭”类型 比如说
typeof(TBase<object>) 和 (typeof(TSub<object>) 来处理
但是实际情况,泛型中可能存在约束 无法直接通过 object 这样的通用方法处理
/// <summary>
/// 注册 泛型
/// “开放”类型 只能存在于typeof操作中
/// </summary>
/// <param name="t1"></param>
/// <param name="t2"></param>
public static void RegisterGeneric(Type t1, Type t2)
{
//判断t1是否 等于/继承/实现t2
if (!t1.IsAssignableFrom(t2))
{
//if (t1.IsGenericTypeDefinition && t2.IsGenericTypeDefinition)//泛型特殊处理
//{
// //通过创建泛型的“封闭”类型判断继承关系
// Type _t1 = t1.MakeGenericType(typeof(object));//泛型约束
// Type _t2 = t2.MakeGenericType(typeof(object));//泛型约束
// if (!_t1.IsAssignableFrom(_t2))
// {
// throw new RegisterException(string.Format("参数类型{0}与{1}不匹配!", t1.Name, t2.Name));
// }
//}
//else
//{
throw new RegisterException(string.Format("参数类型{0}与{1}不匹配!", t1.Name, t2.Name));
//}
}
_types[t1] = t2;
}
求教~~ 泛型 继承 Type --------------------编程问答-------------------- 你定义两个这类的类型出来看看?即使存在约束,想必也不会太复杂吧,至少你在判断时,也用泛型类型T来代替object即可。 --------------------编程问答--------------------
通过baseType一层层找然后比较guid应该安全的,但对图里s.BaseType到底是个啥很奇怪希望楼下能顺便回复下 --------------------编程问答-------------------- s.BaseType.GUID==b.GUID //true --------------------编程问答-------------------- 我在写自己的IOC框架
IOCManage.RegisterGeneric(typeof(IRepository<>), typeof(Repository<>));
var service = IOCManage.GetInstances<IRepository<Customer>>();
这样就能获取到 一个Repository<Customer>实例
现在就是注册的时候 需要对这两个类型进行判断 是否存在 相等/继承/实现 关系
总不可能
IOCManage.RegisterGeneric(typeof(IRepository<Customer>), typeof(Repository<Customer>));
//…………
这样注入吧 ,那样就没意义了 --------------------编程问答--------------------
无法实现对接口的判断
可能我的标题里写了继承
实际上是存在 等于/继承/实现 这三种情况 --------------------编程问答--------------------
BaseType 就是上层继承的类型
最顶层的就是typeof(object) 不需要通过guid判断 直接通过 == 就可以判断
补充:.NET技术 , C#