Есть ли способ передать неизвестное количество типов в универсальный метод в C #? - PullRequest
0 голосов
/ 12 января 2012

У меня есть метод

void InitAndLoadTables(DbConnection cnctn, Dictionary<string, DbTableLoadParameters> tableNamesAndParameters)

где словарь может иметь любое количество таблиц. Каждая таблица соответствует классу.

Когда я перебираю все таблицы, я хотел бы вызвать универсальный метод

public void Init<T>(string tableName)

для всех таблиц. Я пытался включить тип класса, чтобы быть свойством DbTableLoadParameters как

Type ObjectType { get; set; }

и используйте это при вызове Init. Это не работает. Так это вообще возможно сделать? Если бы количество таблиц было бы фиксированным, я мог бы сделать InitAndLoadTables родовым, как

InitAndLoadTables<T, K, V>

но это не так. Так что есть только возможность вызвать Init в другом месте, как

Init<Orders>("Orders");

Спасибо & BR -Матти

1 Ответ

4 голосов
/ 12 января 2012

Невозможно передать произвольное количество аргументов типа в универсальный метод, потому что универсальный метод всегда имеет фиксированное количество аргументов типа.

Однако вам даже не нужно,Есть способ вызвать универсальный метод с известным во время выполнения типом, но это включает отражение, которое звучит так, как будто вы действительно после:

class Program
{
    static void Main(string[] args)
    {
        var myobj = new MyClass();

        // Call MyClass.Init<Orders>
        CallMyClassInit(typeof(Orders), "tableOrders");

        // Call Init<string>
        CallMyClassInit(typeof(string), "tableString");
    }

    static void CallMyClassInit(MyClass obj, Type type, string tableName)
    {
        typeof(MyClass)
            .GetMethod("Init")
            .MakeGenericMethod(type)
            .Invoke(obj, new object[] { tableName });
    }
}

class Orders { }

class MyClass
{
    public void Init<T>(string tableName)
    {
        Console.WriteLine("I was called with type " + typeof(T) + " for table " + tableName);
    }
}

Вывод:

I was called with type ConsoleApplication1.Orders for table tableOrders
I was called with type System.String for table tableString
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...