2

Xamarinポータブルクラスライブラリのリフレクションでネストされたクラスにプロパティを設定する方法を知りたいと思います。C#ポータブルクラスライブラリとネストされたプロパティを使用したリフレクション

私はXamarinポータブルクラスライブラリでリフレクションしてプロジェクトを進めています。

私はこのコードを持っている:一方

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

} 

私はこの機能を持っている:

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

Iは、文字列プロパティを有し、私は(例えば)GetRuntimePropertiesを(使用する場合)は、この機能を約8つのプロパティが返されますので、質問は

私のクラスのプロパティを知っていますか?

その他の例: プロパティが自分のクラスであるかどうかをどのように知ることができますか?

請求書と顧客である例:

EDITありがとうございます。主な考え方はGenericsを使用することです。タイプが明らかになりました。

すべてのケースで反射を使用したいと思います。私は例の多くのコードを追加し :

EDIT 2ありがとうございます。

私はそれが自分自身であることを希望します。

ありがとうございます。

+0

あなたの例のすべてのプロパティとクラスは公開されており、外部から見えてアクセス可能である必要があります。 'myInvoice.Person.Name'にアクセスできます。反射の観点から、 'PropertyInfo'の' PropertyType'プロパティ、すなわち 'property.Name ==" Person "&& property.PropertyType == typeof(Customer)' – Nkosi

+0

を介してタイプにアクセスできます。私はすべてのプロパティを繰り返します。私はタイプを動的に知っていません。この場合、顧客は正しいですが、パラメータがTの場合... – Jnavero

+0

はい、顧客は例ですが、明らかに希望の動作の例ではありません。あなたの期待に正確に合った回答を提供できるように[mcve]を提供してください。 – Nkosi

答えて

0

あなたの例のすべてのプロパティとクラスは公開されているため、外部から見えてアクセス可能である必要があります。だからmyInvoice.Person.Nameにアクセスできます。反射の観点から、あなたはPropertyInfoの名前を確認することができますPropertyInfo

すなわち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 
      } 
     } 
    } 
} 

OR

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

PropertyTypeプロパティ経由種類にアクセスし、それが財産ウィット比較することができますあなたは(人)を確認したい。したがって、あなたのコメントを次のように置き換えてください:

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 
} 
関連する問題