2

このサイト ( http://snipplr.com/view.php?codeview&id=17637 ) にたどり着きました。このサイトでは、次のようなリフレクションの使用が示されています。

public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

   private void button2_Click_1(object sender, EventArgs e)
    {
        var person = new Person { Age = 30, Name = "Tony Montana" };
        var properties = typeof(Person).GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine("{0} = {1}", property.Name, property.GetValue(person, null));
        }
    }

年齢:30歳 名前:トニー・モンタナ

このようにクラス「AnotherPerson」に「Kid」を追加するとどうなるでしょうか

    public class Kid
    {
        public int KidAge { get; set; }
        public string KidName { get; set; }
    }
    public class AnotherPerson
    {
        public int Age { get; set; }
        public string Name { get; set; }
        public Kid Kid { get; set; }
    }

このスニペット;

private void button3_Click(object sender, EventArgs e)
    {
        var anotherPerson = new AnotherPerson { Age = 30, Name = "Tony Montana", Kid = new Kid { KidAge = 10, KidName = "SomeName" } };
        var properties = typeof(AnotherPerson).GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine("{0} = {1}", property.Name, property.GetValue(anotherPerson, null));
        }
    }

年齢: 30歳 名前: トニー・モンタナ 子供: ProjectName.Form1+Kid

私が探していたものではありません....リフレクションを使用して、「キッド」も繰り返し処理できますか?提案?

4

4 に答える 4

0
    var anotherPerson = new AnotherPerson { Age = 30, Name = "Tony Montana", Kid = new Kid { KidAge = 10, KidName = "SomeName" } };
    var properties = typeof(AnotherPerson).GetProperties();
    foreach (PropertyInfo property in properties)
    {

        if (property.PropertyType == typeof(Kid)){
            var pp = typeof(Kid).GetProperties();
            Console.WriteLine("Kid:");
            foreach (PropertyInfo p in pp)
            {
                Console.WriteLine("\t{0} = {1}", p.Name, p.GetValue(anotherPerson.Kid, null));
            }
        }
        else
            Console.WriteLine("{0} = {1}", property.Name, property.GetValue(anotherPerson, null));
    }
于 2013-05-13T13:50:39.360 に答える
0

このコードは、プロパティをループ処理し、(usesメソッドをToString介して) を使用して、プロパティ値の文字列表現を取得します。String.FormatConsole.WriteLine

Kidプロパティ値の表示方法を変更する場合、基本的に次の 2 つのオプションがあります。

  1. リフレクション コード内のプロパティ ( property.PropertyType) の型を確認して、その型に対して別の処理を実行できるようにしますKid

  2. ToStringクラスのメソッドをオーバーライドして、Kid表示する文字列を値として返すようにします。

于 2013-05-13T13:51:24.490 に答える
0

再帰を行うメソッドは、プロパティ内のプロパティの値を取得できます。

public static string GetProperties(object obj)
{
    var t = obj.GetType();
    var properties = t.GetProperties();
    var s = "";
    foreach (PropertyInfo property in properties)
    {
        object propValue = property.GetValue(obj, new object[0]);
        string propertyToString;
        if (t.GetMethod("ToString").DeclaringType != typeof(object))
            propertyToString = propValue.ToString();
        else if (typeof(IConvertible).IsAssignableFrom(property.PropertyType))
            propertyToString = Convert.ToString(propValue);
        else
            propertyToString = GetProperties(propValue);

        s += string.Format("'{0}' = '{1}'", property.Name, propertyToString);
    }
    return s;
}

実用的な目的を念頭に置いている場合は、JSON (またはその他) のシリアル化がより適切な場合があります。たとえば、JSON.netを使用すると同様の文字列が生成されます。

于 2013-05-13T14:00:48.433 に答える
0

このようなヘルパーメソッドを使用できますか?

public List<KeyValuePair<string, object>> GetPropertiesRecursive(object instance)
{
  List<KeyValuePair<string, object>> propValues = new List<KeyValuePair<string, object>>();
  foreach(PropertyInfo prop in instance.GetType().GetProperties())
  {
    propValues.Add(new KeyValuePair<string, object>(prop.Name, prop.GetValue(instance, null));
    propValues.AddRange(GetPropertiesRecursive(prop.GetValue(instance));
  }
}

次のように呼び出します -GetPropertiesRecursive(anotherPerson)

于 2013-05-13T13:47:29.143 に答える