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

當我有字符串屬性和我使用(例如)GetRuntimeProperties()該函數返回大約8個屬性,所以問題是:

我怎麼知道屬性它是我的課程?

其他示例: 如何知道屬性是否是我的類?

謝謝

編輯:

發票,客戶就是例子。主要想法是使用泛型現在的類型是顯而易見的。

我想對所有情況使用反射。

謝謝

編輯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

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屬性訪問類型,你可以檢查的PropertyInfo的名字,並比較其智慧財產你想確認(人)。因此,請將您的評論替換爲:

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 
}