Как считать переменную пользовательской среды в C#?

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

Статические методы

Предположим, что у вас несколько статических методов с таким же именем, как:

public static void DoSomething(TModel model)

public static void DoSomething(TViewModel viewModel, TModel model)

// etc

Если вы создаете Action или Func, который соответствует общему счету и количеству параметров перегрузок, которые вы ищете, вы можете выберите его во время компиляции с относительно небольшим количеством акробатиков.

Пример: выберите первый метод - возвращает void, поэтому используйте Action, принимает один общий. Мы используем объект, чтобы еще не указывать тип:

var method = new Action(MyClass.DoSomething);

Пример: выберите второй метод - возвращает void, поэтому Action, 2 generic типа, поэтому дважды используйте объект типа, один раз для каждого из двух общих параметров :

var method = new Action(MyClass.DoSomething);

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

MethodInfo

Обычно в Reflection вы хотите объект MethodInfo, который вы также можете получить скомпилированным способом. Это когда вы передаете фактические общие типы, которые вы хотите использовать в своем методе. Предполагая, что вам нужен второй метод выше:

var methodInfo = method.Method.MakeGenericMethod(type1, type2);

Существует ваш общий метод без какого-либо поиска отражений или вызовов GetMethod () или фальшивых строк.

Статические методы расширения

Конкретный пример, который вы цитируете с помощью Queryable.Where, когда перегрузки заставляют вас немного причудливо определять Func, но обычно следуют одному и тому же шаблону. Подпись для наиболее часто используемого метода расширения Where () :

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 });
}

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

Редактирование: очищенные объяснения, пример метода экземпляра Валери.

16
задан Deleted 4 August 2010 в 08:42
поделиться

4 ответа

Используйте другую перегрузку Environment.GetEnvironmentVariable - метод , который позволяет указать EnvironmentVariableTarget .

Environment.GetEnvironmentVariable(variable, target);

целью может быть:
EnvironmentVariableTarget.Process ,
EnvironmentVariableTarget.User ,
EnvironmentVariableTarget.Machine .

31
ответ дан 30 November 2019 в 16:49
поделиться
var UserName = Environment.GetEnvironmentVariable("username");
0
ответ дан 30 November 2019 в 16:49
поделиться

Это тот же метод, просто установите второй параметр как Пользователь как:

System.Environment.GetEnvironmentVariable("varName", EnvironmentVariableTarget.User);
5
ответ дан 30 November 2019 в 16:49
поделиться

Используйте вторую перегрузку GetEnvironmentVariable , которая позволяет вам указать EnvironmentVariableTarget .

0
ответ дан 30 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: