2012-09-06 10 views
14

Próbuję ustawić wartość zagnieżdżonej właściwości klasy dynamicznie za pomocą odbicia. Czy ktoś mógłby mi w tym pomóc?Jak ustawić Vaues do zagnieżdżonej własności za pomocą C# Reflection.?

Mam klasę Region jak poniżej.

public class Region 
{ 
    public int id; 
    public string name; 
    public Country CountryInfo; 
} 

public class Country 
{ 
    public int id; 
    public string name; 
} 

Mam czytnik danych Oracle do podawania wartości z kursora Ref.

który da mi jak

Id, nazwa, Country_id, COUNTRY_NAME

mogłem w stanie przypisać wartości do Region.Id, Region.Name przez poniżej.

FieldName="id" 
prop = objItem.GetType().GetProperty(FieldName, BindingFlags.Public | BindingFlags.Instance); 
prop.SetValue(objItem, Utility.ToLong(reader_new[ResultName]), null); 

I dla Zagnieżdżonej Właściwości mogłem wykonać przypisane wartości do poniższych, tworząc instancję, odczytując nazwę pola.

FieldName="CountryInfo.id" 

if (FieldName.Contains('.')) 
{ 
    Object NestedObject = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split('.')[0]), BindingFlags.Public | BindingFlags.Instance); 

    //getting the Type of NestedObject 
    Type NestedObjectType = NestedObject.GetType(); 

    //Creating Instance 
    Object Nested = Activator.CreateInstance(typeNew); 

    //Getting the nested Property 
    PropertyInfo nestedpropinfo = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split('.')[0]), BindingFlags.Public | BindingFlags.Instance); 

    PropertyInfo[] nestedpropertyInfoArray = nestedpropinfo.PropertyType.GetProperties(); 
    prop = nestedpropertyInfoArray.Where(p => p.Name == Utility.Trim(FieldName.Split('.')[1])).SingleOrDefault(); 

    prop.SetValue(Nested, Utility.ToLong(reader_new[ResultName]), null); 
    Nestedprop = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split('.')[0]), BindingFlags.Public | BindingFlags.Instance); 

    Nestedprop.SetValue(objItem, Nested, null); 
} 

Powyższe wartości należy przypisać do Country.Id.

Ale od czasu tworzenia instancji za każdym razem nie mogłem uzyskać poprzedniej wartości Country.Id, jeśli wybiorę opcję Następny kraj.Nazwa.

Czy ktokolwiek mógłby powiedzieć, że może przypisać wartości do objItem(that is Region).Country.Id i objItem.Country.Name. Co oznacza przypisywanie wartości do Zagnieżdżonych Właściwości zamiast tworzenia instancji i przypisywania za każdym razem.

Z góry dziękuję.!

+1

Możliwy duplikat http://stackoverflow.com/questions/1954746/using-reflection -in-c-sharp-to-get-własności-zagnieżdżonego obiektu –

Odpowiedz

35

Należy dzwonić PropertyInfo.GetValue pomocą właściwości Country uzyskać kraj, a następnie PropertyInfo.SetValue pomocą właściwości Id do ustawić identyfikator kraju.

Więc coś takiego:

public void SetProperty(string compoundProperty, object target, object value) 
{ 
    string[] bits = compoundProperty.Split('.'); 
    for (int i = 0; i < bits.Length - 1; i++) 
    { 
     PropertyInfo propertyToGet = target.GetType().GetProperty(bits[i]); 
     target = propertyToGet.GetValue(target, null); 
    } 
    PropertyInfo propertyToSet = target.GetType().GetProperty(bits.Last()); 
    propertyToSet.SetValue(target, value, null); 
} 
+0

Dzięki. Drogi .. To działało jak Urok .. :-) – Sravan

+0

Dlaczego jest to akceptowane jako odpowiedź, rzuca nullref, ponieważ GetValue () zwraca wartość null, jeśli cel nie jest jeszcze utworzony, co spowoduje wyjątek o jedną linię poniżej r. –

1

Get właściwości Nest np Developer.Project.Name

private static System.Reflection.PropertyInfo GetProperty(object t, string PropertName) 
      { 
       if (t.GetType().GetProperties().Count(p => p.Name == PropertName.Split('.')[0]) == 0) 
        throw new ArgumentNullException(string.Format("Property {0}, is not exists in object {1}", PropertName, t.ToString())); 
       if (PropertName.Split('.').Length == 1) 
        return t.GetType().GetProperty(PropertName); 
       else 
        return GetProperty(t.GetType().GetProperty(PropertName.Split('.')[0]).GetValue(t, null), PropertName.Split('.')[1]); 
      } 
+0

To rozwiązanie ma poważną wadę, nie będzie działać z ogólnymi listami. Na przykład podajesz FirstObject.MyList [0]. MojaValue po prostu ulegnie awarii, ponieważ ignoruje pierwszą instancję [0] –

Powiązane problemy