«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу динамически вызывать общие методы с определяемыми временными аргументами типа в C#?

Как я могу динамически вызывать общие методы с определяемыми временными аргументами типа в C#?

Опубликовано в 2025-03-22
Просматривать:619

How Can I Dynamically Invoke Generic Methods with Runtime-Determined Type Arguments in C#?

вызовы общих методов с помощью динамических аргументов

woods

В вашем сценарии вы хотите разобраться через коллекцию интерфейсов в определенном пространстве имен и динамически вызовать общий метод для каждого интерфейса. Тем не менее, вы сталкиваетесь с ошибками с компиляцией из-за неизвестных аргументов типа во время компиляции.

Solution

для динамического вызова общих методов с известными аргументами типа Runtime, вы можете использовать отражение следующим образом:

  1. Получить метод GENTERIC Метод : Использование типа. Определение.
  2. генерировать общий экземпляр метода : вызовите метод MakeGenericMethod в определении общего метода, чтобы сгенерировать конкретный экземпляр метода для желаемого аргумента типа.
  3. пример кода

с использованием системы; Использование System.linq; Использование System.Reflection; Общественный класс TestClass { Public Static Void Callgeneric () { Console.WriteLine ($ "Generic Type: {typeof (t)}"); } Public Static Void Main () { var assembly = assembly.getExecutingAssembly (); var interfaces = assembly.gettypes () . Где (t => t.namespace == "mynamespace.interfaces"); var geneicMethod = typeof (testClass) .getMethod ("callgeneric"); Foreach (var Interfacetype в интерфейсах) { var genericMethodinStance = genericMethod.makegenericMethod (Interfacetype); genericmethodinstance.invoke (null, null); // не требуется цель или аргументы } } }

using System;
using System.Linq;
using System.Reflection;

public class TestClass
{
    public static void CallGeneric()
    {
        Console.WriteLine($"Generic type: {typeof(T)}");
    }

    public static void Main()
    {
        var assembly = Assembly.GetExecutingAssembly();

        var interfaces = assembly.GetTypes()
            .Where(t => t.Namespace == "MyNamespace.Interfaces");

        var genericMethod = typeof(TestClass).GetMethod("CallGeneric");

        foreach (var interfaceType in interfaces)
        {
            var genericMethodInstance = genericMethod.MakeGenericMethod(interfaceType);
            genericMethodInstance.Invoke(null, null); // No target or arguments needed
        }
    }
}

метод Callgeneric определяется как общий метод, который печатает аргумент общего типа.
  • мы извлекаем все типы из конкретного пространства имен, который унаследован от MyNamespace.Interfaces. экземпляр для каждого типа интерфейса.
  • мы вызываем общий экземпляр метода без какой -либо цели или аргументов, поскольку это статический метод без каких -либо параметров.
  • ]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3