C#可移植类库和具有嵌套属性的反射

时间:2016-07-28 22:13:59

标签: c# reflection xamarin portable-class-library printer-control-language

我想知道如何使用Xamarin可移植类库的反射将属性设置为嵌套类。

我正在研究一个反映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: 我在示例中添加了更多代码。

我希望自己很清楚。

谢谢。

2 个答案:

答案 0 :(得分: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
            }   
        }
    }
}

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

答案 1 :(得分: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
}