.net框架中表达式的名称
本文关键字:表达式 框架 net | 更新日期: 2023-09-27 18:01:30
在Visual Studio 2015和c# 6中引入了"nameof"表达式
nameof (c# and Visual Basic Reference)
如果您谈论的是c# 6之前的等效代码,那么这将以一种hack的方式完成属性的工作。它可以扩展为包括字段、方法等。
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;
}
}
只是快速地进行了一下,所以还有很多需要改进的地方,但是您可以这样使用它:
public class myClass
{
public string myProp { get; set; }
}
var a = new myClass();
var result = a.nameof(b => b.myProp);
结果包含'myProp'
更新:
更全面(尽管仍然不那么漂亮)
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;
}
}
访问静态属性/字段:
TestExtension.nameof(() => myClass.MyOtherField)
访问函数中的参数:
void func (int a) {
TestExtension.nameof(() => a);
}
据我所知,有三个选项不必使用魔法字符串
的名称,需要Visual Studio 2015(但可以编译到其他版本的。net框架)
nameof(this.Property)
使用一个方法,该方法接受一个表达式并返回属性名称,如在这篇文章"使用反射获取属性的字符串名称"
var propertyName = GetPropertyName( () => myObject.AProperty); // returns "AProperty"
CallerMemberNameAttribute -(仅在。net框架4.5中可用,包括,因为原始帖子说旧版本,如。net框架4.0,我猜包括4.5)这个方法的缺点是它只在你需要字符串表示当前方法时有用。
public string IsChecked { set{ Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked" } } string GetCurrentMemberName([CallerMemberName] string memberName = "") { return memberName; }
nameOf
-在Compiletime
得到解析-如果您反编译,您将看到编译器只是将类名(没有命名空间(!))转换为常量字符串。所以要小心!
如果您想获得一个类的名称,使用typeof()
或GetType()
在Runtime
获得特定的(可能派生的)类型,并读取
的值.net中的.Name
-属性c# 6 .
在MSDN阅读更多
nameof操作符返回传递给它的变量的字符串表示形式,因此nameof(var1)将返回"var1",这有助于避免我们必须将变量名指定为字符串的代码,如在参数异常中。
在以前的版本中,您可以使用反射或表达式树来实现类似的效果。
@Rob,非常感谢,但是静态成员访问也可以用于非静态类成员。
public static class TestExtension {
public static String nameof<T>(this Expression<Func<T, object>> accessor)
{
return nameof(accessor.Body);
}
}
class MyClass {
public Guid MyOtherField;
}
TestExtension.nameof<MyClass>(o=>o.MyOtherField);
,好消息是类不会被实例化。访问域层dto是很有用的