2

Xamarin 휴대용 클래스 라이브러리에서 중첩 된 클래스로 속성을 설정하는 방법을 알고 싶습니다.C# 휴대용 클래스 라이브러리 및 중첩 된 속성의 반영

저는 Xamarin 휴대용 클래스 라이브러리에서 리플렉션을 사용하여 프로젝트 작업을하고 있습니다. 내가 문자열 속성이있는 경우

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를 사용 :이 기능이

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

} 

반면에 :

이 코드를 약 8 개의 속성을 반환하므로 질문은 다음과 같습니다.

속성이 내 수업인지 어떻게 알 수 있습니까?

다른 예 : 클래스가 내 클래스인지 여부를 어떻게 알 수 있습니까?

송장과 고객은 예 :

편집 주셔서 감사합니다. 주요 아이디어는 Generics를 사용하는 것입니다. 이제 typeof가 분명합니다.

모든 경우 리플렉션을 사용하고 싶습니다. 내가 예에서 더 많은 코드를 추가 :

편집 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 
      } 
     } 
    } 
} 

또는

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 속성을 통해 유형에 액세스하고 속성을 재치 비교할 수 있습니다 당신은 (사람)을 확인하고 싶습니다. 따라서 다음과 같이 귀하의 의견을 대체하십시오 :