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 объектов, так что задайте вопрос:

Как я знаю, обладает ли это свой класс?

Другие примеры: Как узнать, является ли это свойство моим классом?

Спасибо

EDIT:

счета и клиенты являются примерами. Основная идея - использование Generics, теперь типof очевиден.

Я хотел бы использовать отражение для всех случаев.

Спасибо

EDIT 2: добавить больше кода в примере.

Я надеюсь, что это понятно.

спасибо.

+0

Все свойства и классы в вашем примере являются общедоступными и должны быть видимыми и доступными извне. поэтому доступно 'myInvoice.Person.Name'. С точки зрения отражения вы можете получить доступ к типу с помощью свойства PropertyType 'PropertyInfo', то есть' property.Name == «Person» && property.PropertyType == typeof (Customer) ' – Nkosi

+0

Да, это так, но проблема в том, когда я повторяю все свойства. Я не знаю тип динамически. В этом случае Клиент правильный, но если параметр T ... – Jnavero

+0

Да, клиент является примером, но, по-видимому, это не пример вашего желаемого поведения. пожалуйста, предоставьте [mcve], чтобы ответы можно было точно оценить в соответствии с вашими ожиданиями. – Nkosi

ответ

0

Все свойства и классы в вашем примере являются общедоступными и должны быть видимыми и доступными извне. так что myInvoice.Person.Name доступен. С точкой зрения отражения вы можете получить доступ к типу через PropertyType свойства 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

вы можете проверить имя PropertyInfo и сравнить его остроумие собственности вы хотите подтвердить (Person). Так что замените ваш комментарий:

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 
} 
Смежные вопросы