也许你需要这个.工作良好.
我在这里找到了这个.
static void Main(string[] args) { var domain = "matrix"; Check(() => domain); Console.ReadLine(); } static void Check(Expression > expr) { var body = ((MemberExpression)expr.Body); Console.WriteLine("Name is: {0}", body.Member.Name); Console.WriteLine("Value is: {0}", ((FieldInfo)body.Member) .GetValue(((ConstantExpression)body.Expression).Value)); }
输出将是:
Name is: 'domain' Value is: 'matrix'
Markos.. 37
我知道这是一个老问题,但我试图达到同样的目的,谷歌把我送到了这里.几个小时后,我终于找到了办法.我希望其他人会觉得这很有用.
实际上有更多方法可以实现这一目标:
static void Main(string[] args) { GetName(new { var1 }); GetName2(() => var1); GetName3(() => var1); } static string GetName(T item) where T : class { return typeof(T).GetProperties()[0].Name; } static string GetName2 (Expression > expr) { return ((MemberExpression)expr.Body).Member.Name; } static string GetName3 (Func expr) { return expr.Target.GetType().Module.ResolveField(BitConverter.ToInt32(expr.Method.GetMethodBody().GetILAsByteArray(), 2)).Name; }
第一个是最快的.最后2个比第1个慢约20倍.
http://abdullin.com/journal/2008/12/13/how-to-find-out-variable-or-parameter-name-in-c.html
也许你需要这个.工作良好.
我在这里找到了这个.
static void Main(string[] args) { var domain = "matrix"; Check(() => domain); Console.ReadLine(); } static void Check(Expression > expr) { var body = ((MemberExpression)expr.Body); Console.WriteLine("Name is: {0}", body.Member.Name); Console.WriteLine("Value is: {0}", ((FieldInfo)body.Member) .GetValue(((ConstantExpression)body.Expression).Value)); }
输出将是:
Name is: 'domain' Value is: 'matrix'
我知道这是一个老问题,但我试图达到同样的目的,谷歌把我送到了这里.几个小时后,我终于找到了办法.我希望其他人会觉得这很有用.
实际上有更多方法可以实现这一目标:
static void Main(string[] args) { GetName(new { var1 }); GetName2(() => var1); GetName3(() => var1); } static string GetName(T item) where T : class { return typeof(T).GetProperties()[0].Name; } static string GetName2 (Expression > expr) { return ((MemberExpression)expr.Body).Member.Name; } static string GetName3 (Func expr) { return expr.Target.GetType().Module.ResolveField(BitConverter.ToInt32(expr.Method.GetMethodBody().GetILAsByteArray(), 2)).Name; }
第一个是最快的.最后2个比第1个慢约20倍.
http://abdullin.com/journal/2008/12/13/how-to-find-out-variable-or-parameter-name-in-c.html
city
在这种情况下是类型的实例string
.当您致电时,.GetType()
您将返回实际的字符串类型,该类型对您的所有特定城市实例都不了解.
我很难理解为什么你不能在代码中输入"city"作为字符串文字,如果那就是你需要的.如果您分享了您想要使用此值的内容以及在何种情况下您将调用您的DoSomething()
函数,这可能会有所帮助.
目前,我最好的猜测是你真正想要做的是反映整个Person
班级以获得该班级中的字段列表:
public void DoSomething() { MemberInfo[] members = this.GetType().GetMembers(); // now you can do whatever you want with each of the members, // including checking their .Name properties. }
好的,根据你的编辑我还有更多的东西给你.
您可以在运行时找到使用属性修饰的字段名称,如下所示:
Type t = typeof(Person); foreach (MemberInfo member in t.GetMembers() .Where(m => m.GetCustomAttributes(typeof(MyCustomAttribute)).Any() ) ) { // "member" is a MemberInfo object for a Peson member that is // decorated with your attribute }
如果需要,您还可以在第一个GetMembers()调用中使用绑定标志将其限制为仅字段.