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).
}

Emit基类名与继承类名相同;Protobuffer不接受循环继承

原来它是通过protobuffer序列化时使用的RuntimeTypeModel。用派生类型子类化发出的类型没有问题。

我需要添加实例的类型而不是TypeA:

RuntimeTypeModel.Default.Add(typeof(TypeA), true).AddSubType(555, typeAinstance.GetType());

…之前我有:

RuntimeTypeModel.Default.Add(typeof(TypeA), true).AddSubType(555, TypeA);

当然会返回一个循环错误。

我希望这对将来的人有帮助