Files

268 lines
6.5 KiB
C#
Raw Permalink Normal View History

2026-08-27 10:56:38 -06:00
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
namespace ProtoBuf;
internal sealed class Helpers
{
public static readonly Type[] EmptyTypes = Type.EmptyTypes;
private Helpers()
{
}
public static StringBuilder AppendLine(StringBuilder builder)
{
return builder.AppendLine();
}
[Conditional("DEBUG")]
public static void DebugWriteLine(string message, object obj)
{
}
[Conditional("DEBUG")]
public static void DebugWriteLine(string message)
{
}
[Conditional("TRACE")]
public static void TraceWriteLine(string message)
{
}
[Conditional("DEBUG")]
public static void DebugAssert(bool condition, string message)
{
}
[Conditional("DEBUG")]
public static void DebugAssert(bool condition, string message, params object[] args)
{
}
[Conditional("DEBUG")]
public static void DebugAssert(bool condition)
{
}
public static void Sort(int[] keys, object[] values)
{
bool flag;
do
{
flag = false;
for (int i = 1; i < keys.Length; i++)
{
if (keys[i - 1] > keys[i])
{
int num = keys[i];
keys[i] = keys[i - 1];
keys[i - 1] = num;
object obj = values[i];
values[i] = values[i - 1];
values[i - 1] = obj;
flag = true;
}
}
}
while (flag);
}
internal static MethodInfo GetInstanceMethod(Type declaringType, string name)
{
return declaringType.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
}
internal static MethodInfo GetStaticMethod(Type declaringType, string name)
{
return declaringType.GetMethod(name, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
}
internal static MethodInfo GetStaticMethod(Type declaringType, string name, Type[] parameterTypes)
{
return declaringType.GetMethod(name, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, parameterTypes, null);
}
internal static MethodInfo GetInstanceMethod(Type declaringType, string name, Type[] types)
{
if (types == null)
{
types = EmptyTypes;
}
return declaringType.GetMethod(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, types, null);
}
internal static bool IsSubclassOf(Type type, Type baseClass)
{
return type.IsSubclassOf(baseClass);
}
public static ProtoTypeCode GetTypeCode(Type type)
{
TypeCode typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Empty:
case TypeCode.Boolean:
case TypeCode.Char:
case TypeCode.SByte:
case TypeCode.Byte:
case TypeCode.Int16:
case TypeCode.UInt16:
case TypeCode.Int32:
case TypeCode.UInt32:
case TypeCode.Int64:
case TypeCode.UInt64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.Decimal:
case TypeCode.DateTime:
case TypeCode.String:
return (ProtoTypeCode)typeCode;
default:
if ((object)type == typeof(TimeSpan))
{
return ProtoTypeCode.TimeSpan;
}
if ((object)type == typeof(Guid))
{
return ProtoTypeCode.Guid;
}
if ((object)type == typeof(Uri))
{
return ProtoTypeCode.Uri;
}
if ((object)type == typeof(byte[]))
{
return ProtoTypeCode.ByteArray;
}
if ((object)type == typeof(Type))
{
return ProtoTypeCode.Type;
}
return ProtoTypeCode.Unknown;
}
}
internal static Type GetUnderlyingType(Type type)
{
return Nullable.GetUnderlyingType(type);
}
internal static bool IsValueType(Type type)
{
return type.IsValueType;
}
internal static bool IsSealed(Type type)
{
return type.IsSealed;
}
internal static bool IsClass(Type type)
{
return type.IsClass;
}
internal static bool IsEnum(Type type)
{
return type.IsEnum;
}
internal static MethodInfo GetGetMethod(PropertyInfo property, bool nonPublic, bool allowInternal)
{
if ((object)property == null)
{
return null;
}
MethodInfo methodInfo = property.GetGetMethod(nonPublic);
if ((object)methodInfo == null && !nonPublic && allowInternal)
{
methodInfo = property.GetGetMethod(nonPublic: true);
if ((object)methodInfo == null && !methodInfo.IsAssembly && !methodInfo.IsFamilyOrAssembly)
{
methodInfo = null;
}
}
return methodInfo;
}
internal static MethodInfo GetSetMethod(PropertyInfo property, bool nonPublic, bool allowInternal)
{
if ((object)property == null)
{
return null;
}
MethodInfo methodInfo = property.GetSetMethod(nonPublic);
if ((object)methodInfo == null && !nonPublic && allowInternal)
{
methodInfo = property.GetGetMethod(nonPublic: true);
if ((object)methodInfo == null && !methodInfo.IsAssembly && !methodInfo.IsFamilyOrAssembly)
{
methodInfo = null;
}
}
return methodInfo;
}
internal static ConstructorInfo GetConstructor(Type type, Type[] parameterTypes, bool nonPublic)
{
return type.GetConstructor(nonPublic ? (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : (BindingFlags.Instance | BindingFlags.Public), null, parameterTypes, null);
}
internal static ConstructorInfo[] GetConstructors(Type type, bool nonPublic)
{
return type.GetConstructors(nonPublic ? (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : (BindingFlags.Instance | BindingFlags.Public));
}
internal static PropertyInfo GetProperty(Type type, string name, bool nonPublic)
{
return type.GetProperty(name, nonPublic ? (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) : (BindingFlags.Instance | BindingFlags.Public));
}
internal static object ParseEnum(Type type, string value)
{
return Enum.Parse(type, value, ignoreCase: true);
}
internal static MemberInfo[] GetInstanceFieldsAndProperties(Type type, bool publicOnly)
{
BindingFlags bindingAttr = (publicOnly ? (BindingFlags.Instance | BindingFlags.Public) : (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic));
PropertyInfo[] properties = type.GetProperties(bindingAttr);
FieldInfo[] fields = type.GetFields(bindingAttr);
MemberInfo[] array = new MemberInfo[fields.Length + properties.Length];
properties.CopyTo(array, 0);
fields.CopyTo(array, properties.Length);
return array;
}
internal static Type GetMemberType(MemberInfo member)
{
return member.MemberType switch
{
MemberTypes.Field => ((FieldInfo)member).FieldType,
MemberTypes.Property => ((PropertyInfo)member).PropertyType,
_ => null,
};
}
internal static bool IsAssignableFrom(Type target, Type type)
{
return target.IsAssignableFrom(type);
}
internal static Assembly GetAssembly(Type type)
{
return type.Assembly;
}
internal static byte[] GetBuffer(MemoryStream ms)
{
return ms.GetBuffer();
}
}