在早期版本的 C# 中通过 C#6 的 nameof 功能的代码部分实现?
Partial implemention through code of C#6's nameof functionality in earlier versions of C#?
"nameof" 是一个了不起的想法,即使部分复制也可以很好地复制到以前的版本中。
我对 public 属性 这样的名字特别感兴趣:
public class MyClass
{
public SomeType Myproperty {get;set;}
}
static Main()
{
MyClass myClass = new MyClass();
Console.WriteLine(Utilities.NameOf(myClass.MyProperty)); //Writes "MyProperty".
Console.ReadKey();
}
有没有办法做到这一点(也许通过反射等)?如果我们能做到这一点,它还可以为我们将来升级到 C#6 时准备代码,只需将 Utilities.NameOf 替换为 nameof.
感谢Alexei Levenkov指点正确的方向,
Schotime's for his answer in this question 和
agent-j's for his answer in this question
有一个简单而优雅的解决方案,有两个版本:
public static class Util
{
public static string NameOf<TProperty>(Expression<Func<TProperty>> e)
{
return (e.Body as MemberExpression).Member.Name;
}
public static string NameOf<TClass, TProperty>(Expression<Func<TClass, TProperty>> e)
{
return (e.Body as MemberExpression).Member.Name;
}
}
并且可以这样使用:
public class MyClass
{
public SomeProperty MyProperty { get; set; }
}
static void Main(string[] args)
{
MyClass myClass = new MyClass();
string case1 = Util.NameOf(() => myClass.MyProperty); //Case1 when an instance is available 250x
string case2 = Util.NameOf(() => (null as MyClass).MyProperty); //Case2 when no instance is available 175x
string case3 = Util.NameOf((MyClass c) => c.MyProperty); //Case3 when no instance is available 330x
string caseTest = "MyProperty"; //Test case 1x
}
在每个案例结束时,数字显示每次调用相对于文字字符串赋值的速度。
这是通过将每次调用的 return 值分配给字符串数组并将其与相同值 "MyProperty"
的文字字符串分配进行比较来完成的。
Case2 似乎是赢家。
"nameof" 是一个了不起的想法,即使部分复制也可以很好地复制到以前的版本中。
我对 public 属性 这样的名字特别感兴趣:
public class MyClass
{
public SomeType Myproperty {get;set;}
}
static Main()
{
MyClass myClass = new MyClass();
Console.WriteLine(Utilities.NameOf(myClass.MyProperty)); //Writes "MyProperty".
Console.ReadKey();
}
有没有办法做到这一点(也许通过反射等)?如果我们能做到这一点,它还可以为我们将来升级到 C#6 时准备代码,只需将 Utilities.NameOf 替换为 nameof.
感谢Alexei Levenkov指点正确的方向,
Schotime's for his answer in this question 和
agent-j's for his answer in this question
有一个简单而优雅的解决方案,有两个版本:
public static class Util
{
public static string NameOf<TProperty>(Expression<Func<TProperty>> e)
{
return (e.Body as MemberExpression).Member.Name;
}
public static string NameOf<TClass, TProperty>(Expression<Func<TClass, TProperty>> e)
{
return (e.Body as MemberExpression).Member.Name;
}
}
并且可以这样使用:
public class MyClass
{
public SomeProperty MyProperty { get; set; }
}
static void Main(string[] args)
{
MyClass myClass = new MyClass();
string case1 = Util.NameOf(() => myClass.MyProperty); //Case1 when an instance is available 250x
string case2 = Util.NameOf(() => (null as MyClass).MyProperty); //Case2 when no instance is available 175x
string case3 = Util.NameOf((MyClass c) => c.MyProperty); //Case3 when no instance is available 330x
string caseTest = "MyProperty"; //Test case 1x
}
在每个案例结束时,数字显示每次调用相对于文字字符串赋值的速度。
这是通过将每次调用的 return 值分配给字符串数组并将其与相同值 "MyProperty"
的文字字符串分配进行比较来完成的。
Case2 似乎是赢家。