当前位置:编程学习 > C#/ASP.NET >>

如何判断两个泛型的 "开放" 类型 是否为继承关系

判断两个类型是否为继承关系 一般使用 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>));
//…………

这样注入吧 ,那样就没意义了 --------------------编程问答--------------------
引用 2 楼 phommy 的回复:


通过baseType一层层找然后比较guid应该安全的,但对图里s.BaseType到底是个啥很奇怪希望楼下能顺便回复下

无法实现对接口的判断
可能我的标题里写了继承
实际上是存在 等于/继承/实现 这三种情况 --------------------编程问答--------------------
引用 3 楼 phommy 的回复:
s.BaseType.GUID==b.GUID   //true

BaseType 就是上层继承的类型
最顶层的就是typeof(object) 不需要通过guid判断 直接通过 == 就可以判断
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,