Можно ли извлечь имя аргумента из значения аргумента в C #? - PullRequest
1 голос
/ 20 апреля 2011

Я хотел бы знать, могу ли я получить имя аргумента из значения аргумента. Мне нужна эта функциональность, потому что я создал себе статический класс (называемый Requires), чтобы сделать проверку аргументов в теле метода однострочной. В настоящее время методы проверки реализованы следующим образом:

Requires.StringNotNullOrEmpty(string argName, string argValue) {...}

Чтобы проверить аргумент, вы должны предоставить имя аргумента (позднее использовавшегося для создания значимого исключения ArgumentException) и его значение.

У меня вопрос: есть ли способ извлечь имя аргумента из значения аргумента внутри тела метода?

Заранее спасибо и счастливой Пасхи!

Ответы [ 5 ]

1 голос
/ 20 апреля 2011
0 голосов
/ 20 апреля 2011

Не уверен, что это то, что вы имели в виду

internal class TestClass
{

private void DoSomething(string myArg)
{
    // returns the name of the argument = "myArg"
    string myArgName = GetArgumentName(() => myArg);
    // check
    System.Diagnostics.Debug.Assert(string.Compare("myArg", myArgName, System.StringComparison.InvariantCulture) == 0, "names do not match");
}


private static string GetArgumentName<T>(System.Linq.Expressions.Expression<System.Func<T>> argument)
{
    string argumentName = null;
    System.Linq.Expressions.MemberExpression body = (System.Linq.Expressions.MemberExpression)argument.Body;
    if (body.Member != null)
    {
        argumentName = body.Member.Name;
    }

    if (argumentName == null)
    {
        // could not retrieve argument name
    }

    return argumentName;
}

}

0 голосов
/ 20 апреля 2011

Нет. Точка. Вы знаете имя arbument (argName). Вы не можете знать, от чего был SET, потому что ... это даже не часть аргумента. Это часть знания внешнего класса, а не аргумент (который будет возвращать argName).

0 голосов
/ 20 апреля 2011

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

0 голосов
/ 20 апреля 2011
class A
{
    public void MyMethod(int num, string aString)
    { 
        ParameterInfo[] parameters = typeof(A).GetMethod("MyMethod", BindingFlags.Public|BindingFlags.Instance).GetParameters();
        string secondParameterName = parameters[1].Name;   //you will get aString
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...