Emit基类名与继承类名相同;Protobuffer不接受循环继承
本文关键字:继承 Protobuffer 不接受 循环 基类 Emit | 更新日期: 2023-09-27 18:18:23
我已经发出了返回传入类型的对象的代码,其中属性更改通知被包装到虚拟属性中,并为客户端跟踪修改。这个新类型将在客户端和服务器之间共享(使用protobuf.net序列化)。我仅限于不使用第三方库,除了使用protobuf.net。
我遇到的问题是,当我尝试使用protobuffer序列化新对象列表(例如,TypeA)时,我遇到了"意外子类型:TypeA",当我尝试使用RuntimeTypeModel将子类型添加为protobuffer的模型时,我遇到了"不允许循环继承",protobuffer此时不接受,AFAIK。
我对Reflection很陌生。Emit -是否有一种方法可以使所发出的新类的类型不同于我所发出的类型,至少在名称上不同?在这种情况下,我可能能够克服循环继承限制。我想避免创建/复制新对象。
例如,生成一个新对象:
NewTypeA
-base TypeA
代替:
TypeA
-base TypeA
-sub-type TypeA
IL发射器:
usage: Type aType = CreateProxy(TypeA);
Activator.CreateInstance(aType);
public static Type CreateProxy(Type type)
{
var assmName = new AssemblyName("DynamicProxyAssembly");
ab = AppDomain.CurrentDomain.DefineDynamicAssembly(assmName, AssemblyBuilderAccess.Run);
mb = _ab.DefineDynamicModule(assmName.Name);
TypeBuilder typeBuilder = mb.DefineType(type.Namespace + "." + type.Name + "__proxy", TypeAttributes.Public, type);
typeBuilder.AddInterfaceImplementation(typeof(INotifyPropertyChanged));
FieldBuilder eventField = CreatePropertyChangedEvent(typeBuilder);
MethodBuilder raisePropertyChanged = CreateRaisePropertyChanged(typeBuilder, eventField);
MethodInfo isModifiedSetMethod = type.GetProperty("Modified").SetMethod;
foreach property in type where virtual, wrap method with propertychangednotification...
Type ret = typeBuilder.CreateType(); // this returns TypeA__proxy derived from itself (base=TypeA__proxy).
}
原来它是通过protobuffer序列化时使用的RuntimeTypeModel。用派生类型子类化发出的类型没有问题。
我需要添加实例的类型而不是TypeA:
RuntimeTypeModel.Default.Add(typeof(TypeA), true).AddSubType(555, typeAinstance.GetType());
…之前我有:
RuntimeTypeModel.Default.Add(typeof(TypeA), true).AddSubType(555, TypeA);
当然会返回一个循环错误。
我希望这对将来的人有帮助