Как считать переменную пользовательской среды в C#?
Вы можете несколько изящно выбрать определенную общую перегрузку метода во время компиляции, не передавая ни одной строки для поиска во время выполнения, как и другие ответы здесь.
Статические методы
Предположим, что у вас несколько статических методов с таким же именем, как:
public static void DoSomething(TModel model)
public static void DoSomething(TViewModel viewModel, TModel model)
// etc
Если вы создаете Action или Func, который соответствует общему счету и количеству параметров перегрузок, которые вы ищете, вы можете выберите его во время компиляции с относительно небольшим количеством акробатиков.
Пример: выберите первый метод - возвращает void, поэтому используйте Action, принимает один общий. Мы используем объект, чтобы еще не указывать тип:
var method = new Action
Пример: выберите второй метод - возвращает void, поэтому Action, 2 generic типа, поэтому дважды используйте объект типа, один раз для каждого из двух общих параметров :
var method = new Action(MyClass.DoSomething);
Вы получили только тот метод, который вам нужен, без сумасшедшей сантехники, и без поиска во времени или использования рискованных строк.
MethodInfo
Обычно в Reflection вы хотите объект MethodInfo, который вы также можете получить скомпилированным способом. Это когда вы передаете фактические общие типы, которые вы хотите использовать в своем методе. Предполагая, что вам нужен второй метод выше:
var methodInfo = method.Method.MakeGenericMethod(type1, type2);
Существует ваш общий метод без какого-либо поиска отражений или вызовов GetMethod () или фальшивых строк.
public static IQueryable Where(this IQueryable, Expression>)
Очевидно, что это будет немного сложнее - вот оно:
var method = new Func,
Expression>,
IQueryable>(Queryable.Where);
var methodInfo = method.Method.MakeGenericMethod(modelType);
Методы экземпляров
Включение комментария Валери - чтобы получить метод экземпляра, вам нужно сделать что-то очень похожее. Предположим, что у вас есть этот метод экземпляра в вашем классе:
public void MyMethod(T1 thing)
Сначала выберите метод так же, как и для статики:
var method = new Action(MyMethod);
Затем вызовите GetGenericMethodDefinition(), чтобы перейти к общий метод MethodInfo и, наконец, передать ваш тип (ы) с помощью MakeGenericMethod():
var methodInfo = method.Method.GetGenericMethodDefinition().MakeGenericMethod(type1);
Развязка MethodInfo и типы параметров
Это не было задано в вопросе, но как только вы сделайте это, вы можете выбрать метод в одном месте и решить, какие типы передать его другому. Вы можете отделить эти 2 шага.
Если вы не уверены в параметрах родового типа, которые вы собираетесь пройти, вы можете всегда приобретать объект MethodInfo без них.
Static :
var methodInfo = method.Method;
Экземпляр:
var methodInfo = method.Method.GetGenericMethodDefinition();
И передайте это другому методу, который знает типы, которые он хочет создать, и вызовет метод с - например:
processCollection(methodInfo, type2);
...
protected void processCollection(MethodInfo method, Type type2)
{
var type1 = typeof(MyDataClass);
object output = method.MakeGenericMethod(type1, type2).Invoke(null, new object[] { collection });
}
. Особенно это особенно важно в том, чтобы выбрать конкретный метод экземпляра класса изнутри класса, а затем разоблачить его для внешних вызывающих абонентов, которым он нужен с различными типами позже.
Редактирование: очищенные объяснения, пример метода экземпляра Валери.