Реализация классов на C#

У меня в проекте есть несколько классов, которые обладают общими свойствами:

  1. У них у всех есть статический метод GetRandom() который возвращает случайный элемент соответствующего класса.

  2. У всех есть метод ToString()

Например вот такой класс:

class MyClass
{
    public int y;

    public MyClass(int y)
    {
        this.y = y;
    }

    public static MyClass GetRandom()
    {
        var r = new Random();
        return new MyClass(r.Next(0, 10));
    }

    public override string ToString()
    {
        return $"MyClass({y})";
    }
}

Иногда с этими классами мне требуется выполнять одну и ту же последовательность действий, соответственно я решил вынести эту последовательность в функцию.

Например если мне нужно уметь выводить случайный элемент класса то я напишу такую функцию:

public static void PrintRandom<T>()
{
    Console.WriteLine(T.GetRandom());
}

Такой код работать не будет. Насколько я понимаю C# просто не знает, что у T Есть метод GetRandom().

Как можно реализовать мою задумку?

Полный код программы:

class Program
{
    class MyClass
    {
        public int y;

        public MyClass(int y)
        {
            this.y = y;
        }

        public static MyClass GetRandom()
        {
            var r = new Random();
            return new MyClass(r.Next(0, 10));
        }

        public override string ToString()
        {
            return $"MyClass({y})";
        }
    }
    
    public static void PrintRandom<T>()
    {
        Console.WriteLine(T.GetRandom());
    }
    
    public static void Main()
    {
        Console.WriteLine(MyClass.GetRandom()); //Здесь все работает
        PrintRandom<MyClass>(); // Здесь нет
    }
}

Ответы (1 шт):

Автор решения: user11354240

В C#11 в интерфейсах можно определять статические виртуальные методы: https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/static-virtual-interface-members Если C#11 использовать не получится, то придется переделывать структуру классов (делать GetRandom не-статическим).

→ Ссылка