de tres maneras:
1) algo sin reflexión en absoluto:
GetParameterName1(new { variable });
public static string GetParameterName1<T>(T item) where T : class
{
if (item == null)
return string.Empty;
return item.ToString().TrimStart('{').TrimEnd('}').Split('=')[0].Trim();
}
2) utiliza la reflexión, pero esto es mucho más rápido que otros dos.
GetParameterName2(new { variable });
public static string GetParameterName2<T>(T item) where T : class
{
if (item == null)
return string.Empty;
return typeof(T).GetProperties()[0].Name;
}
3) El más lento de todos, no lo use.
GetParameterName3(() => variable);
public static string GetParameterName3<T>(Expression<Func<T>> expr)
{
if (expr == null)
return string.Empty;
return ((MemberExpression)expr.Body).Member.Name;
}
Para obtener un nombre y valor de parámetro combinado, puede ampliar estos métodos. Por supuesto, es fácil obtener valor si pasa el parámetro por separado como otro argumento, pero eso no es elegante. En lugar de ello:
1)
public static string GetParameterInfo1<T>(T item) where T : class
{
if (item == null)
return string.Empty;
var param = item.ToString().TrimStart('{').TrimEnd('}').Split('=');
return "Parameter: '" + param[0].Trim() +
"' = " + param[1].Trim();
}
2)
public static string GetParameterInfo2<T>(T item) where T : class
{
if (item == null)
return string.Empty;
var param = typeof(T).GetProperties()[0];
return "Parameter: '" + param.Name +
"' = " + param.GetValue(item, null);
}
3)
public static string GetParameterInfo3<T>(Expression<Func<T>> expr)
{
if (expr == null)
return string.Empty;
var param = (MemberExpression)expr.Body;
return "Parameter: '" + param.Member.Name +
"' = " + ((FieldInfo)param.Member).GetValue(((ConstantExpression)param.Expression).Value);
}
1 y 2 son de velocidad comparable ahora, 3 es de nuevo lento.
Hmm, ¿por qué querrías hacer eso? Solo necesito entender la lógica detrás de esto –
Creo que alguien quería lo mismo en Ruby. Podrías buscar y ver si tiene alguna indicación sobre cómo hacerlo. – Gishu
Este es un tema recurrente que me vuelve loco. Una pregunta intelectual que se usará para hacer algo, y en lugar de una respuesta ... la gente quiere saber por qué quieres hacer ... Hay suficiente lógica para responder la pregunta ... –