日期:2014-05-17  浏览次数:21199 次

能从一个Type继承吗?
从一个类型继承出另一个类型大家都知道怎样写,比如:

class A
{
}

class B:A
{
}

这个代码中B继承了A,A是B的基类,可是,如果A是一个反射出来的类型,那么B怎样继承?

Type type=typeof(A);

class B:type???
{
}

------解决方案--------------------
继承是设计时概念,反射是运行时概念。

怪异的需求产生怪异的设计。
------解决方案--------------------
这也不行,type是动态得知的
------解决方案--------------------
听听别人怎么说
------解决方案--------------------
还是使用接口吧。
------解决方案--------------------
探讨

我有一个.net的DLL,里面定义了一个抽像的基类,这个类需要被继承后才能调用。
然后这个DLL不能正常的被引用,只能通过Assembly.Load方法来加载,那么这个DLL中的类型怎样被继承又怎样重写基类的方法呢?

如果能直接引用就可以编写它的代码了,可是现在是Load的后期加载。怎么继承这个类型?

其实这不是怪异的想法。
如果是一个DLL被加密,加密后只能通过Load来加载,……

------解决方案--------------------
如一楼所说,继承是设计,反射式运行时。你可以试用类中类。
------解决方案--------------------
一定要继承么?
可否用组合方式
Class B

直接把A类型的反射和调用等放这里面。
}
------解决方案--------------------
msdn search emit
------解决方案--------------------
要技术实现,只能使用Emit,如果说你觉得和问题关系不大,只能说明你不会用Emit,退一步就是根本没理解它的强大。我给你写一段用Emit创建运行时类型的例子,你可以参考下,那个Emit可是.NET的精华啊:
C# code

        public static TypeDes CreateType(IDictionary<string, Type> propertys, Type parent)
        {
            StringBuilder sb = new StringBuilder();
            var e = propertys.GetEnumerator();
            while (e.MoveNext())
            {
                sb.Append(e.Current.Key + ":" + e.Current.Value.FullName + ",");
            }
            string pname = MD5Core.GetHashString(sb.ToString(0, sb.Length - 1));
            TypeDes typedes;
            if (!typeCache.TryGetValue(pname, out typedes))
            {
                AssemblyName aName = new AssemblyName(Guid.NewGuid().ToString());
                AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
                ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
                TypeBuilder tb = mb.DefineType(pname, TypeAttributes.Public, parent);//parent就是所需继承的父类
                ConstructorBuilder ctor0 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes);
                ILGenerator ctor0IL = ctor0.GetILGenerator();
                ctor0IL.Emit(OpCodes.Ldarg_0);
                ctor0IL.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
                ctor0IL.Emit(OpCodes.Ret);
                MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
                FieldBuilder fb = null;
                PropertyBuilder pb = null;
                MethodBuilder mba = null;
                ILGenerator il = null;
                foreach (string key in propertys.Keys)
                {
                    //创建私有字段,存放属性值
                    fb = tb.DefineField("_" + key, propertys[key], FieldAttributes.Private);
                    //创建公有属性
                    pb = tb.DefineProperty(key, PropertyAttributes.HasDefault, propertys[key], null);
                    //设置GET方法
                    mba = tb.DefineMethod("get_" + key, getSetAttr, propertys[key], Type.EmptyTypes);
                    il = mba.GetILGenerator();
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldfld, fb);
                    il.Emit(OpCodes.Ret);
                    pb.SetGetMethod(mba);
                    //设置SET方法
                    mba = tb.DefineMethod("set_" + key, getSetAttr, null, new Type[] { propertys[key] });
                    il = mba.GetILGenerator();