当前位置: 代码迷 >> ASP.NET >> 找遍stackoverflow,没找到答案,那位进入看看
  详细解决方案

找遍stackoverflow,没找到答案,那位进入看看

热度:8465   发布时间:2013-02-25 00:00:00.0
找遍stackoverflow,没找到答案,那位进来看看?
C# code
  public class Employee    {        private string name;        private int id;        public string Name        {            get { return name; }            set { name = value; }        }        public int ID        {            get { return id; }            set { id = value; }        }      }     protected void Test3()        {            Type myType = typeof(Employee);            FieldInfo[] fi = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);            foreach (var r in fi)            {                MemberTypes mymembertyps = r.MemberType;                   //我能找到这个r 对应的属性么?            }            PropertyInfo[] pi = myType.GetProperties(BindingFlags.Public | BindingFlags.Instance);         }

我们知道通过GetFields可以找到这个类的所有字段,通过GetProperties可以找到这个类的所有属性。
现在的问题是这样的,比如我在遍历字段集合的时候,能不能找到当前这个字段对应的属性?
或者遍历属性集合的时候,能不能找到当前属性对应的字段?
三思而后答。

------解决方案--------------------------------------------------------
foreach (var r in fi)
{
//MemberTypes mymembertyps = r.MemberType;
Response.Write(r.Name + "<br />");//字段对应的属性
}
PropertyInfo[] pi = myType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo o in pi)
{
Response.Write(o.Name + "<br />");//属性对应的字段

}
------解决方案--------------------------------------------------------
Field和Property本身并没有对应关系,只是一般生成的代码看起来像有对应关系

C# code
public class Customer     {         private string name;         public string Name         {             get { return name; }             set            {                 if(string.IsNullOrEmpty(name))throw new ArgumentException("Name cannot be blank","Name");                 name = value;             }         }     }
------解决方案--------------------------------------------------------
查找字段对应的后备属性?

这需要反射获得IL,然后反编译,再解析了。因为很多时候属性访问器是复杂的,看下面的代码:

C# code
class Person{    public int ID { get; set; }    private string firstName;    private string lastName;    public string Name    {        get { return firstName + " " + lastName; }        set { firstName = (value + " ").Split(' ')[0]; lastName = (value + " ").Split(' ')[1]; }    }    public string Profile    {        get         {            DbContext db = new DbContext();            return db.Users.SingleOrDefault(x => x.ID == ID).Profile;        }    }    public int RandomNumber { get { return new Random().Next(0, 100); } set { } }}