La expresión "nameof" se introduce en Visual Studio 2015 y c# 6
nombre de (Referencia de C# y Visual Basic)
¿Cómo puede usarlo o escribir un método similar en versiones anteriores como .net framework 4?
Si está hablando de un equivalente para C # antes de C # 6, esto hará el trabajo (de una manera pirateada) para las propiedades. Probablemente se pueda ampliar para incluir campos, métodos, etc.
public static class TestExtension { public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor) { if (propertyAccessor.Body.NodeType == ExpressionType.MemberAccess) { var memberExpression = propertyAccessor.Body as MemberExpression; if (memberExpression == null) return null; return memberExpression.Member.Name; } return null; } }Acabo de preparar esto rápidamente, por lo que hay mucho que mejorar, pero lo usas así:
public class myClass { public string myProp { get; set; } } var a = new myClass(); var result = a.nameof(b => b.myProp);El resultado contiene 'myProp'
Actualizar:
Más completo (aunque todavía no tan bonito)
public static class TestExtension { public static String nameof<T, TT>(this Expression<Func<T, TT>> accessor) { return nameof(accessor.Body); } public static String nameof<T>(this Expression<Func<T>> accessor) { return nameof(accessor.Body); } public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor) { return nameof(propertyAccessor.Body); } private static String nameof(Expression expression) { if (expression.NodeType == ExpressionType.MemberAccess) { var memberExpression = expression as MemberExpression; if (memberExpression == null) return null; return memberExpression.Member.Name; } return null; } }Acceso a propiedades/campos estáticos:
TestExtension.nameof(() => myClass.MyOtherField)Acceso a parámetros dentro de funciones:
void func (int a) { TestExtension.nameof(() => a); }nameOf : se resuelve en Compiletime : si descompila, verá que el compilador simplemente tradujo el nombre de la clase (sin el espacio de nombres (!)) en una cadena constante. ¡Así que ten cuidado!
Si desea obtener el nombre de una clase, use typeof() o GetType() para obtener el tipo específico (tal vez derivado) en tiempo de Runtime y lea el valor de
la .Name en .net < C#6.
Leer más en MSDN
Que yo sepa, hay tres opciones para no tener que usar una cuerda mágica
cuyo nombre requiere Visual Studio 2015 (pero se puede compilar en otras versiones de .net framework)
nameof(this.Property)use un método que tome una expresión y devuelva el nombre de la propiedad como se encuentra en esta publicación " Obtener el nombre de cadena de la propiedad usando la reflexión "
var propertyName = GetPropertyName( () => myObject.AProperty); // returns "AProperty"CallerMemberNameAttribute: (solo disponible en .NET Framework 4.5, incluido porque la publicación original decía versiones anteriores como .NET Framework 4.0, que supongo que incluye 4.5) La desventaja de este método es que solo es útil cuando necesita una representación en cadena del método actual usted está operando en.
public string IsChecked { set{ Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked" } } string GetCurrentMemberName([CallerMemberName] string memberName = "") { return memberName; }