2010-11-02 23 views
5

C# değerinde yansıma kullanarak çalışma zamanında bir sınıf nesnesinden özellik değerine erişiyorum.C# - Alt sınıfın özellik değeri getiriliyor

public bool GetValue(string fieldName, out object fieldValue) 
    { 
     // Get type of current record 
     Type curentRecordType = _currentObject.GetType(); 
     PropertyInfo property = curentRecordType.GetProperty(fieldName); 

     if (property != null) 
     { 
      fieldValue = property.GetValue(_currentObject, null).ToString(); 
      return true; 
     } 
     else 
     { 
      fieldValue = null; 
      return false; 
     } 
    } 

Bu yönteme, Property Name parametresini parametre: fieldName olarak iletirim. Şimdi, çalışma zamanında yukarıdaki sınıfın alt nesnesindeki bir özellik değerine erişmem gerekiyor.
Orada herhangi bir kişi, lütfen child object özellik değerine nasıl erişebilirim?

+0

Başka bir sorunuz mu var? – leppie

+0

sorumu düzenledim, child object özellik değerine erişmenin bir yoluna ihtiyacım var. – iniki

cevap

6

Rasgele yuvalanmış alt nesneler üzerinde nesneleri bulmak istediğiniz için, yinelemeli olarak çağırabileceğiniz bir işleve ihtiyacınız vardır. Bu, ebeveynlerine geri dönen çocuklarınız olabileceği için karmaşıktır, dolayısıyla aramanızda daha önce gördüğünüz nesneleri izlemeniz gerekir.

static bool GetValue(object currentObject, string propName, out object value) 
{ 
    // call helper function that keeps track of which objects we've seen before 
    return GetValue(currentObject, propName, out value, new HashSet<object>()); 
} 

static bool GetValue(object currentObject, string propName, out object value, 
        HashSet<object> searchedObjects) 
{ 
    PropertyInfo propInfo = currentObject.GetType().GetProperty(propName); 
    if (propInfo != null) 
    { 
     value = propInfo.GetValue(currentObject, null); 
     return true; 
    } 
    // search child properties 
    foreach (PropertyInfo propInfo2 in currentObject.GetType().GetProperties()) 
    { // ignore indexed properties 
     if (propInfo2.GetIndexParameters().Length == 0) 
     { 
      object newObject = propInfo2.GetValue(currentObject, null); 
      if (newObject != null && searchedObjects.Add(newObject) && 
       GetValue(newObject, propName, out value, searchedObjects)) 
       return true; 
     } 
    } 
    // property not found here 
    value = null; 
    return false; 
} 

size özelliği sadece bu yüzden gibi, bunun yolunu iletebilirsiniz olduğunu hangi nesne çocuk biliyorsanız

:

public bool GetValue(string pathName, out object fieldValue) 
{ 
    object currentObject = _currentObject; 
    string[] fieldNames = pathName.Split("."); 

    foreach (string fieldName in fieldNames) 
    { 
     // Get type of current record 
     Type curentRecordType = currentObject.GetType(); 
     PropertyInfo property = curentRecordType.GetProperty(fieldName); 

     if (property != null) 
     { 
      currentObject = property.GetValue(currentObject, null).ToString(); 
     } 
     else 
     { 
      fieldValue = null; 
      return false; 
     } 
    } 
    fieldValue = currentObject; 
    return true; 
} 

yerine GetValue("foo", out val) gibi çağıran sen GetValue("foo.bar", out val) gibi çağırır.

+0

, yüzlerce özellik olduğu için benim durumumda mümkün değildir. Kodumun çocuk nesnesine inebileceği ve yalnızca üst Nesne ve Özellik adı girişi sağlayan özellik değerini getirebileceği kısa ve etkili bir yöntem ister. – iniki

+0

Yani, tüm nesneler arasında her özelliğin benzersiz bir adı olduğu ve yalnızca isminin verildiği şekilde keyfi olarak yuvalanmış bir özelliği bulabilmeniz için bir nesne ağacının olduğunu söylüyorsunuz? (eğer foo.bar.baz.qux'iniz varsa, sadece "qux" ifadesini geçmek ve fonksiyonun "foo.bar.baz" içinde olduğunu anlamak zorundasınız) – Gabe

+0

evet, sadece ana nesneyi ve Özellik Adını girmeniz gerekir – iniki

0

Yansımayı kullanarak alt nesneyi alın ve değeri aynı şekilde almak için yansımayı kullanın.

+0

GetNestedTypes() kullanarak kastediyorsunuz? – iniki

0
public void Main(){ 
    var containerObject = new ContainerObject(); 
    object propertyValue; 
    object nestedPropertyValue; 
    if(GetValue(containerObject, "FirstPropertyName", out propertyValue){ 
     bool success = GetValue(propertyValue, "NestedPropertyName", out nestedPropertyValue); 
    } 

} 

public bool GetValue(object currentObject, string propertyName, out object propertyValue) 
{ 
    // Get type of current record 
    var currentObjectType = currentObject.GetType(); 
    PropertyInfo propertyInfo = currentObjectType.GetProperty(propertyName); 

    propertyValue = propertyInfo != null 
        ? propertyInfo.GetValue(currentObject,null) 
        : null; 
    return propertyValue == null; 
} 
+0

Teşekkürler smartcaveman, ama ana nesnenin hangi özel özelliğinin yuvalanmış mülk için ebeveyn olacağını önceden bilmiyorum. Bu durumda kod snippet'im sorunumu çözmez. – iniki

+0

Tüm özellikleri GetProperty yerine GetProperty (ad) kullanarak alabilirsiniz. Hedefi daha fazla tanımlamak için size daha fazla yardımcı olabilirim. Her özellik için yol adını veren – smartcaveman

İlgili konular