namespace InnovEnergy.Lib.Utils.Reflection;

public abstract class Member
{
    public abstract String Name { get; }
    public abstract Type   Type { get; }

    public abstract Boolean IsPublic  { get; }
    public abstract Boolean IsPrivate { get; }
    public abstract Boolean IsStatic  { get; }
        
    public abstract IEnumerable<Attribute> Attributes { get; }
}


public static class Members
{
    public static IEnumerable<Member> OfInstance<T>(T instance) where T : notnull
    {
        return instance.GetMembers();
    }

    public static IEnumerable<Member> GetMembers<T>(this T instance) where T : notnull
    {
        var fields  = instance.GetFields();
        var props   = instance.GetProperties();
        var methods = instance.GetMethods();

        return fields
              .Concat<Member>(props)
              .Concat(methods);
    }
}