日期:2014-05-18  浏览次数:20962 次

如何获取类中属性的名称
比如现在有一个类如下:
C# code

class Item {
    public GUID Id { get; set; }
    public string Name { get; set; }
}


有什么办法可以在调用的时候获取类中属性的名称如:
C# code

Item item = new Item();


如何做到通过 item.Name 得到 "Name" 字符串

------解决方案--------------------
C# code
string name = typeof(Item).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)[1].Name;

------解决方案--------------------
将item封装成类,里面发布Name属性
------解决方案--------------------
C# code

public string GetPropertyName(Expression<Func<Item, string>> expr)
        {
            var name = ((MemberExpression)expr.Body).Member.Name;
            return name;
        }

string name = GetPropertyName(o=>o.Name);

------解决方案--------------------
探讨
引用:

引用:
引用:

C# code
string name = typeof(Item).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)[1].Name;

请问我如何指定获取呢 您这代……

------解决方案--------------------
我想,反射是一个从外向内的窥探工具,而你的要求是从内向外反馈任意一个属性的名称,所以直接使用反射可能没法实现。

另一方面,EF使用Original与Current维护一个实体的变化情况,还有EntityKey对象和StateManager帮助,要我们操心的并不多。你去控制一个实体的某几个属性是否更新,是不是有点画蛇添足了?

一点拙见,仅供参考。
------解决方案--------------------
我搞错了,用泛型吧,无意中发现调用的地方居然可以不用写类型?奇怪

C# code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            string name = GetPropertyName(o => o.Name);
            Console.WriteLine(name);

            string id = GetPropertyName(o => o.Id);
            Console.WriteLine(id);

            Console.ReadKey();
        }

        public static string GetPropertyName<T>(Expression<Func<Item, T>> expr)
        {
            var name = ((MemberExpression)expr.Body).Member.Name;
            return name;
        }


    }
    class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

}