Как можно вызвать статическую функцию, если у нас есть только информация о типе?

Можно ли привести пример использования статического метода в C# на основе данного кода: <br/> <pre><code>System.Type type = typeof(MyClass);
type.MyStaticFunk();</code></pre>?
  • 25 декабря 2024 г. 14:33
Ответы на вопрос 2
В C# статические методы нельзя вызывать через объект `Type` напрямую, но вы можете использовать отражение (reflection) для вызова статического метода, если у вас есть только информация о типе. В вашем примере, чтобы вызвать статический метод `MyStaticFunk`, вы можете использовать метод `MethodInfo.Invoke`.

Вот пример кода, который демонстрирует, как это сделать:

```csharp
using System;
using System.Reflection;

class MyClass
{
    public static void MyStaticFunk()
    {
        Console.WriteLine("Статический метод был вызван!");
    }
}

class Program
{
    static void Main()
    {
        // Получаем тип MyClass
        Type type = typeof(MyClass);
        
        // Получаем информацию о методе MyStaticFunk
        MethodInfo methodInfo = type.GetMethod("MyStaticFunk", BindingFlags.Public | BindingFlags.Static);

        if (methodInfo != null)
        {
            // Вызываем статический метод
            methodInfo.Invoke(null, null);
        }
        else
        {
            Console.WriteLine("Метод не найден.");
        }
    }
}
```

В этом коде:

1. Мы определяем класс `MyClass` с публичным статическим методом `MyStaticFunk`.
2. В методе `Main` мы получаем тип `MyClass` с помощью `typeof`.
3. Затем мы используем `GetMethod` для получения информации о методе `MyStaticFunk`, указывая, что мы ищем публичный статический метод.
4. Если метод найден, мы вызываем его с использованием `Invoke`, передавая `null` в качестве первого аргумента, так как это статический метод (он не требует экземпляра класса), а вторым аргументом является массив параметров метода (в данном случае `null`, так как метод не принимает аргументов).

Таким образом, с помощью рефлексии можно вызывать статические методы, имея информацию о типе.
RTFM: Type.GetMethod 
public class Foo
{
    public static string Bar() => "Bar() is called";
}

var type = typeof(Foo);
var mi = type.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public);
var r = mi.Invoke(null, []);
Console.WriteLine($"Result: {r}");

>> Result: Bar() is called
Похожие вопросы