2

Ich würde gerne wissen, wie man Eigenschaft in eine geschachtelte Klasse mit Reflektion auf Xamarin Portable Klassenbibliothek setzen.C# Portable Klassenbibliothek und Reflektion mit geschachtelten Eigenschaften

Ich arbeite an einem Projekt mit Überlegungen zu einer Xamarin Portable Class Library.

Ich habe diesen Code:

public class Customer 
{ 
    public string Name { get; set; } 
    public string FirstName { get; set; } 
    public int Id { get; set; }   
} 

public class Invoice 
{ 
    public string Description { get; set; } 
    public int Id { get; set; } 

    public Customer Person { get; set; } 

    //New Edit... 
    //Clases... 
    // ... More classes 

    public OtherClass N-1 {get; set} 
    public MoreClases N {get;set;} 

} 

auf der anderen Seite habe ich diese Funktion:

public void TestCode() 
    { 
     var myCustomer = new Customer() 
     { 
      FirstName = "qwerty", 
      Name = "asdfgh", 
      Id = 1 
     }; 

     var myInvoice = new Invoice() 
     { 
      Description = "chocos", 
      Id = 1, 
      Person = myCustomer, 
     }; 

     var properties = myInvoice.GetType().GetRuntimeProperties(); 

     foreach (var property in properties) 
     { 
      var value = property.GetValue(myInvoice); 
      if (value != null) 
      { 
       if (property.PropertyType.IsGenericParameter) 
       { 
        //Have Generic parameters 
       } 
       else 
       { 
        //How I Know if my class == person??? 
        // EDIT: 
        // If I Use typeof I must check all clases.. 
       } 
      } 
     } 
    } 

Wenn ich die String-Eigenschaft haben, und ich verwenden (zum Beispiel) GetRuntimeProperties() Mit dieser Funktion gibt ungefähr 8 Eigenschaften zurück, also ist die Frage:

Wie ich weiß, wenn die Eigenschaft es meine Kategorie ist?

Anderes Beispiel: Woher weiß ich, ob die Eigenschaft meine Klasse ist?

Danke

EDIT:

Rechnung und Kunden, sind Beispiele. Die Hauptidee ist die Verwendung Generics jetzt der Typ ist offensichtlich.

Ich möchte Reflexion für alle Fälle verwenden.

Danke

EDIT 2: ich mehr Code in dem Beispiel hinzuzufügen.

Ich hoffe, das ist mir klar.

Vielen Dank.

+0

Alle Eigenschaften und Klassen in Ihrem Beispiel sind öffentlich und sollten extern sichtbar und zugänglich sein. Auf 'myInvoice.Person.Name' kann also zugegriffen werden. Aus einer Reflektionsperspektive können Sie auf den Typ über die 'PropertyType'-Eigenschaft von' PropertyInfo' zugreifen, dh 'property.Name ==" Person "&& property.PropertyType == typeof (Kunde)' – Nkosi

+0

Ja, ist es, aber das Problem ist wenn ich alle Eigenschaften iteriere. Ich kenne den Typ nicht dynamisch. In diesem Fall ist der Kunde korrekt, aber wenn der Parameter T ist ... – Jnavero

+0

Ja Kunde ist ein Beispiel, aber anscheinend ist es kein Beispiel für Ihr gewünschtes Verhalten. Bitte geben Sie eine [mcve] an, damit die Antworten genau Ihren Erwartungen entsprechen. – Nkosi

Antwort

0

Alle Eigenschaften und Klassen in Ihrem Beispiel sind öffentlich und sollten extern sichtbar und zugänglich sein. so ist myInvoice.Person.Name zugänglich. Aus einer Reflexion Perspektive können Sie die Art über die PropertyType Eigenschaft PropertyInfo

dh property.Name == "person" && property.PropertyType == typeof(Customer)

foreach (var property in properties) 
{ 
    var propertyType = property.PropertyType; 
    var value = property.GetValue(myInvoice); 
    if (value != null) 
    { 
     if (propertyType.IsGenericParameter) 
     { 
      //Have Generic parameters 
     } 
     else 
     { 
      //How I Know if my class == person 
      if(propertyType.Name == "Person" && propertyType = typeof(Customer)){ 
       // class == person 
      } 
     } 
    } 
} 

ODER

Zugriff
foreach (var property in properties) 
{ 
    var propertyType = property.PropertyType; 
    var value = property.GetValue(myInvoice); 
    if (value != null) 
    {     
     if(value is Customer) { 
      // class == person 
      var person = value as Customer; 
      var name = person.Name; 
     } 
    } 
} 
0

Sie den Namen des Property überprüfen und vergleichen sie die Eigenschaft wit Sie möchten bestätigen (Person). Ersetzen Sie also Ihren Kommentar mit:

if (property.Name == "Person") 
{ 
    // This is a Person PropertyInfo. 

    Person person = value as Person; 
    if (person == null) 
    { 
     // This is not expected. Log and return 
    } 

    //Now you can access person.Name 
} 
Verwandte Themen