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