Reflection 反思C#问题

Reflection 反思C#问题,reflection,c#-2.0,Reflection,C# 2.0,我在获取一个属性是另一个类的类的值时遇到问题 以下是一个例子: public class Person { private int age; private string name; public Person() { Address = new Address(); } public int Age { get { return age; } set { age = value; }

我在获取一个属性是另一个类的类的值时遇到问题

以下是一个例子:

public class Person 
{
    private int age;
    private string name;

    public Person()
    {
        Address = new Address();

    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public Address Address { get; set; }
}

public class Address
{
    public string street { get; set; }
    public string houseno { get; set; }
}


public class Program
{
    static void Main(string[] args)
    {

        Person person = new Person();
        person.Age = 27;
        person.Name = "Fernando Vezzali";
        person.Address.houseno = "123";
        person.Address.street = "albert street";

        Type type = typeof(Person);

        PropertyInfo[] properties = type.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine("{0} = {1}", property.Name, property.GetValue(person, null));

        }
   }
}
但是有了这个,我就不知道地址的值了

这里有人可以帮忙吗?

type.GetProperties()
只获取该类型的的属性,其中一个是对象
地址<代码>街道
房屋号
不是
个人
的财产

Console.Write…
对每个参数隐式调用
ToString()
。因此,您可能会看到“Address-Namespace.Address”作为输出,因为
someAddressObject.ToString()
将返回类型名

在这种特定情况下,获取所需内容的最简单方法是在
地址
对象上覆盖
ToString()
,以输出对象的一些有意义的字符串表示形式:

public override ToString()
{
    return string.Format("#{0} {1}",
        this.houseno,
        this.street); //returns #123 StreetName
}
如果您确实需要在对象上写入每个子对象的每个属性,这可能会变得相当复杂-您实际上是在谈论序列化,它沿着对象树递归到每个对象中。

type.GetProperties()
只获取该类型的的属性,其中一个是对象
地址
<代码>街道和
房屋号
不是
个人
的财产

Console.Write…
对每个参数隐式调用
ToString()
。因此,您可能会看到“Address-Namespace.Address”作为输出,因为
someAddressObject.ToString()
将返回类型名

在这种特定情况下,获取所需内容的最简单方法是在
地址
对象上覆盖
ToString()
,以输出对象的一些有意义的字符串表示形式:

public override ToString()
{
    return string.Format("#{0} {1}",
        this.houseno,
        this.street); //returns #123 StreetName
}

如果您确实需要在对象上写入每个子对象的每个属性,这可能会变得相当复杂-您实际上是在谈论序列化,它会沿着对象树递归到每个对象中。

或者您需要在地址中实现ToString(),如果您乐于返回格式化字符串作为Address的值,或者您的迭代代码需要检查每个属性以确定该属性的类型是否也公开属性,并将其排队以供进一步检查。

或者您需要在Address中实现ToString(),如果您对返回格式化字符串作为Address的值感到满意,或者您的迭代代码需要检查每个属性,以确定该属性的类型是否也公开属性,并将其排队以供进一步检查。

考虑到Jason的答案,下面是可能的字符串

您还可以将返回的反射对象强制转换为一个地址,以访问完整的对象和属性

public class Address
{
    public string street { get; set; }
    public string houseno { get; set; }
    public override ToString() {
        return string.Format("street: {0}, house: {1}", street, houseno);
    }
}

考虑到Jason的答案,这里是可能的ToString

您还可以将返回的反射对象强制转换为一个地址,以访问完整的对象和属性

public class Address
{
    public string street { get; set; }
    public string houseno { get; set; }
    public override ToString() {
        return string.Format("street: {0}, house: {1}", street, houseno);
    }
}

您的foreach正确地迭代了所有属性,我认为它隐式地调用了ToString以获取值,因此重写Address类的ToString方法,并将属性作为字符串返回

或者,在foreach中,通过获取属性类型并选中IsValueType或IsClass,测试属性是值类型还是类类型。如果IsValueType为false,则像对Person的属性一样迭代该属性的类类型的属性

类似这样的东西(您可能需要tweek来编译它,但它给了您想法):


您的foreach正确地迭代了所有属性,我认为它隐式地调用了ToString以获取值,因此重写Address类的ToString方法,并将属性作为字符串返回

或者,在foreach中,通过获取属性类型并选中IsValueType或IsClass,测试属性是值类型还是类类型。如果IsValueType为false,则像对Person的属性一样迭代该属性的类类型的属性

类似这样的东西(您可能需要tweek来编译它,但它给了您想法):


嗨,Jeremy,这是我想做的,但如何做,这是我的问题,我可以检查它的类,但无法获得该属性(地址)的每个属性。嗨,Jeremy,这是我想做的,但如何做,这是我的问题,我可以检查它的类,但无法获得该属性(地址)的每个属性。