218 lines
3.4 KiB
C#
218 lines
3.4 KiB
C#
using System;
|
|
using System.Reflection;
|
|
|
|
namespace ProtoBuf;
|
|
|
|
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
|
|
public class ProtoMemberAttribute : Attribute, IComparable, IComparable<ProtoMemberAttribute>
|
|
{
|
|
internal MemberInfo Member;
|
|
|
|
internal MemberInfo BackingMember;
|
|
|
|
internal bool TagIsPinned;
|
|
|
|
private string name;
|
|
|
|
private DataFormat dataFormat;
|
|
|
|
private int tag;
|
|
|
|
private MemberSerializationOptions options;
|
|
|
|
public string Name
|
|
{
|
|
get
|
|
{
|
|
return name;
|
|
}
|
|
set
|
|
{
|
|
name = value;
|
|
}
|
|
}
|
|
|
|
public DataFormat DataFormat
|
|
{
|
|
get
|
|
{
|
|
return dataFormat;
|
|
}
|
|
set
|
|
{
|
|
dataFormat = value;
|
|
}
|
|
}
|
|
|
|
public int Tag => tag;
|
|
|
|
public bool IsRequired
|
|
{
|
|
get
|
|
{
|
|
return (options & MemberSerializationOptions.Required) == MemberSerializationOptions.Required;
|
|
}
|
|
set
|
|
{
|
|
if (value)
|
|
{
|
|
options |= MemberSerializationOptions.Required;
|
|
}
|
|
else
|
|
{
|
|
options &= ~MemberSerializationOptions.Required;
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool IsPacked
|
|
{
|
|
get
|
|
{
|
|
return (options & MemberSerializationOptions.Packed) == MemberSerializationOptions.Packed;
|
|
}
|
|
set
|
|
{
|
|
if (value)
|
|
{
|
|
options |= MemberSerializationOptions.Packed;
|
|
}
|
|
else
|
|
{
|
|
options &= ~MemberSerializationOptions.Packed;
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool OverwriteList
|
|
{
|
|
get
|
|
{
|
|
return (options & MemberSerializationOptions.OverwriteList) == MemberSerializationOptions.OverwriteList;
|
|
}
|
|
set
|
|
{
|
|
if (value)
|
|
{
|
|
options |= MemberSerializationOptions.OverwriteList;
|
|
}
|
|
else
|
|
{
|
|
options &= ~MemberSerializationOptions.OverwriteList;
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool AsReference
|
|
{
|
|
get
|
|
{
|
|
return (options & MemberSerializationOptions.AsReference) == MemberSerializationOptions.AsReference;
|
|
}
|
|
set
|
|
{
|
|
if (value)
|
|
{
|
|
options |= MemberSerializationOptions.AsReference;
|
|
}
|
|
else
|
|
{
|
|
options &= ~MemberSerializationOptions.AsReference;
|
|
}
|
|
options |= MemberSerializationOptions.AsReferenceHasValue;
|
|
}
|
|
}
|
|
|
|
internal bool AsReferenceHasValue
|
|
{
|
|
get
|
|
{
|
|
return (options & MemberSerializationOptions.AsReferenceHasValue) == MemberSerializationOptions.AsReferenceHasValue;
|
|
}
|
|
set
|
|
{
|
|
if (value)
|
|
{
|
|
options |= MemberSerializationOptions.AsReferenceHasValue;
|
|
}
|
|
else
|
|
{
|
|
options &= ~MemberSerializationOptions.AsReferenceHasValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool DynamicType
|
|
{
|
|
get
|
|
{
|
|
return (options & MemberSerializationOptions.DynamicType) == MemberSerializationOptions.DynamicType;
|
|
}
|
|
set
|
|
{
|
|
if (value)
|
|
{
|
|
options |= MemberSerializationOptions.DynamicType;
|
|
}
|
|
else
|
|
{
|
|
options &= ~MemberSerializationOptions.DynamicType;
|
|
}
|
|
}
|
|
}
|
|
|
|
public MemberSerializationOptions Options
|
|
{
|
|
get
|
|
{
|
|
return options;
|
|
}
|
|
set
|
|
{
|
|
options = value;
|
|
}
|
|
}
|
|
|
|
public int CompareTo(object other)
|
|
{
|
|
return CompareTo(other as ProtoMemberAttribute);
|
|
}
|
|
|
|
public int CompareTo(ProtoMemberAttribute other)
|
|
{
|
|
if (other == null)
|
|
{
|
|
return -1;
|
|
}
|
|
if (this == other)
|
|
{
|
|
return 0;
|
|
}
|
|
int num = tag.CompareTo(other.tag);
|
|
if (num == 0)
|
|
{
|
|
num = string.CompareOrdinal(name, other.name);
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public ProtoMemberAttribute(int tag)
|
|
: this(tag, forced: false)
|
|
{
|
|
}
|
|
|
|
internal ProtoMemberAttribute(int tag, bool forced)
|
|
{
|
|
if (tag <= 0 && !forced)
|
|
{
|
|
throw new ArgumentOutOfRangeException("tag");
|
|
}
|
|
this.tag = tag;
|
|
}
|
|
|
|
internal void Rebase(int tag)
|
|
{
|
|
this.tag = tag;
|
|
}
|
|
}
|