Editor/TypeLibraryFixes/TypeSerializedMethodFixed.cs
using Sandbox;
using Sandbox.Internal;
using System;
using System.Collections.Generic;
using System.Reflection;
namespace ExtendedEditor.TypeLibraryFixes;
public class TypeSerializedMethodFixed : SerializedProperty
{
public override bool IsMethod => true;
public override SerializedObject Parent => _typeSerializedObject;
public override string DisplayName => _displayInfo.Name;
public override string Name => _method.Name;
public override string Description => _displayInfo.Description;
public override string GroupName => _displayInfo.Group;
public override bool IsEditable => !_displayInfo.ReadOnly;
public override bool IsPublic => _method.IsPublic;
public override Type PropertyType => _method.ReturnType;
public override string SourceFile { get; } = null!;
public override int SourceLine { get; } = 0;
public override int Order => _displayInfo.Order;
private DisplayInfo _displayInfo;
private readonly TypeSerializedObjectFixed _typeSerializedObject;
private readonly MethodInfo _method;
public TypeSerializedMethodFixed(TypeSerializedObjectFixed typeSerializedObject, MethodInfo method)
{
ArgumentNullException.ThrowIfNull(typeSerializedObject, nameof(typeSerializedObject));
ArgumentNullException.ThrowIfNull(method, nameof(method));
_typeSerializedObject = typeSerializedObject;
_method = method;
_displayInfo = DisplayInfo.ForMember(method, inherit: true);
var sourceLocationAttribute = method.GetCustomAttribute<SourceLocationAttribute>();
if(sourceLocationAttribute is not null)
{
SourceLine = sourceLocationAttribute.Line;
SourceFile = sourceLocationAttribute.Path;
}
}
public override void SetValue<T>(T value)
{
}
public override T GetValue<T>(T defaultValue)
{
return default!;
}
/// <inheritdoc />
public override IEnumerable<Attribute> GetAttributes()
{
return _method?.GetCustomAttributes() ?? base.GetAttributes();
}
public override bool TryGetAsObject(out SerializedObject obj)
{
obj = default!;
return false;
}
public override void Invoke()
{
if(_method.IsStatic)
{
_method.Invoke(null, []);
}
else
{
_method.Invoke(_typeSerializedObject.GetTargetObject(), []);
}
}
}