¿Cómo puedo pasar el nombre de una variable a una función?

Resuelto GateKiller asked hace 16 años • 23 respuestas

Permítanme usar el siguiente ejemplo para explicar mi pregunta:

public string ExampleFunction(string Variable) {
    return something;
}

string WhatIsMyName = "Hello World";
string Hello = ExampleFunction(WhatIsMyName);

Cuando paso la variable WhatIsMyNamea ExampleFunction, quiero poder obtener una cadena con el nombre de la variable original . Quizás algo como:

Variable.OriginalName.ToString() // == "WhatIsMyName"

¿Hay alguna manera de hacer esto?

GateKiller avatar Sep 16 '08 20:09 GateKiller
Aceptado

Lo que quieres no es posible directamente, pero puedes usar Expresiones en C# 3.0:

public void ExampleFunction(Expression<Func<string, string>> f) {
    Console.WriteLine((f.Body as MemberExpression).Member.Name);
}

ExampleFunction(x => WhatIsMyName);

Tenga en cuenta que esto depende de un comportamiento no especificado y, si bien funciona en los compiladores C# y VB actuales de Microsoft, y en el compilador C# de Mono, no hay garantía de que no deje de funcionar en versiones futuras.

Konrad Rudolph avatar Sep 16 '2008 13:09 Konrad Rudolph

Sé que esta publicación es muy antigua, pero como ahora hay una forma en el compilador de C#10, pensé en compartirla para que otros la sepan.

Ahora puede usar CallerArgumentExpressionAttribute como se muestra

// Will throw argument exception if string IsNullOrEmpty returns true
public static void ValidateNotNullorEmpty(
  this string str,
  [CallerArgumentExpression("str")]string strName = null
)
{       
  if (string.IsNullOrEmpty(str))
  {
    throw new ArgumentException($"'{strName}' cannot be null or empty.", strName);
  }
}

Ahora llama con:

param.ValidateNotNullorEmpty();

arrojará error:"param cannot be null or empty."

en lugar de "cadena no puede ser nula o vacía"

Greg M avatar Nov 19 '2021 17:11 Greg M

Esto no es exactamente posible, de la manera que usted quisiera. C# 6.0 introducen el nombre del Operador que debería ayudar a mejorar y simplificar el código. El nombre del operador resuelve el nombre de la variable que se le pasa.

El uso para su caso se vería así:

public string ExampleFunction(string variableName) {
    //Construct your log statement using c# 6.0 string interpolation
    return $"Error occurred in {variableName}";
}

string WhatIsMyName = "Hello World";
string Hello = ExampleFunction(nameof(WhatIsMyName));

Un beneficio importante es que se realiza en tiempo de compilación,

El nombre de la expresión es una constante. En todos los casos, nameof(...) se evalúa en tiempo de compilación para generar una cadena. Su argumento no se evalúa en tiempo de ejecución y se considera código inalcanzable (sin embargo, no emite una advertencia de "código inalcanzable").

Puede encontrar más información aquí.

Versión anterior de C 3.0 y superior
para desarrollar la respuesta de Nawfals

GetParameterName2(new { variable });

//Hack to assure compiler warning is generated specifying this method calling conventions
[Obsolete("Note you must use a single parametered AnonymousType When Calling this method")]
public static string GetParameterName<T>(T item) where T : class
{
    if (item == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}
johnny 5 avatar Aug 31 '2015 14:08 johnny 5
static void Main(string[] args)
{
  Console.WriteLine("Name is '{0}'", GetName(new {args}));
  Console.ReadLine();
}

static string GetName<T>(T item) where T : class
{
  var properties = typeof(T).GetProperties();
  Enforce.That(properties.Length == 1);
  return properties[0].Name;
}

Más detalles están en esta publicación de blog .

Rinat Abdullin avatar Dec 13 '2008 16:12 Rinat Abdullin