首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

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

2012-11-14 
找遍stackoverflow,没找到答案,那位进来看看?C# codepublic class Employee{private string nameprivate

找遍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 { } }} 

热点排行