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(), []);
        }
    }
}