Это мои 2 цента на основе ответа Grax , но с двумя параметрами, необходимыми для общего метода.
Предположим, что ваш метод определяется следующим образом в классе Helpers:
public class Helpers
{
public static U ConvertCsvDataToCollection(string csvData)
where U : ObservableCollection
{
//transform code here
}
}
В моем случае тип U всегда является наблюдаемым объектом хранения коллекции типа T.
Поскольку у меня есть предопределенные типы, я сначала создаю «фиктивные» объекты, которые представляют наблюдаемый набор (U) и объект, хранящийся в нем (T), и который будет использоваться ниже, чтобы получить их тип при вызове Make
object myCollection = Activator.CreateInstance(collectionType);
object myoObject = Activator.CreateInstance(objectType);
Затем вызовите GetMethod, чтобы найти вашу общую функцию:
MethodInfo method = typeof(Helpers).
GetMethod("ConvertCsvDataToCollection");
До сих пор вышеупомянутый вызов в значительной степени идентичен тому, что было объяснено выше, но с небольшой разницей, когда вам нужно передать ему несколько параметров.
Вам нужно передать массив Type [] в функцию MakeGenericMethod, которая содержит типы «фиктивных» объектов, которые были созданы выше:
MethodInfo generic = method.MakeGenericMethod(
new Type[] {
myCollection.GetType(),
myObject.GetType()
});
Как только это будет сделано, вам нужно вызвать метод Invoke, как указано выше.
generic.Invoke(null, new object[] { csvData });
И все готово.
UPDATE:
Поскольку @Bevan выделен, мне не нужно создавать массив при вызове функции MakeGenericMethod, поскольку он принимает параметры, и мне не нужно создавать объект, чтобы получить типы, поскольку я могу просто передать типы непосредственно этой функции. В моем случае, поскольку у меня есть типы, предопределенные в другом классе, я просто изменил свой код на:
object myCollection = null;
MethodInfo method = typeof(Helpers).
GetMethod("ConvertCsvDataToCollection");
MethodInfo generic = method.MakeGenericMethod(
myClassInfo.CollectionType,
myClassInfo.ObjectType
);
myCollection = generic.Invoke(null, new object[] { csvData });
myClassInfo содержит 2 свойства типа Type
, которые я установил во время выполнения на основе перечисления значение передается конструктору и предоставит мне соответствующие типы, которые затем я использую в MakeGenericMethod.
Еще раз спасибо за выделение этого @Bevan.
Если Вы смотрите x => x + 1
, Это берет параметр x и возвращает x, увеличенный одним. Компилятор будет использовать вывод типа для вычитания этого, x имеет, вероятно, интервал типа и возвратит другой интервал, таким образом, у Вас есть лямбда, которая берет параметр x интервала типа и возвращает целое число.
() => 3;
то же, но не берет параметр, оно возвратит целое число.
() => Console.WriteLine("hello");
приведет к пустому методу без параметров.
Это - список пустого аргумента, означая, что лямбда-выражение не берет аргументов.