¿Cómo puedo pasar el nombre de una variable a una función?
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 WhatIsMyName
a 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?
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.
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"
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;
}
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 .