代码之家  ›  专栏  ›  技术社区  ›  Perpetualcoder

如何创建一个接受任何对象并为所有属性返回名称:值对的方法?

  •  -1
  • Perpetualcoder  · 技术社区  · 16 年前

    例如,我有一个简单的类

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

    我需要创建一个方法,该方法接受任何类,并将对象中设置的属性值以字符串形式输出,格式为“Age:35;Name:John Doe;”

    我正在寻找以下行的方法签名

    public string SpitNameValuePairs<T>() 
    

    或者类似的东西。如果使用反射,如何有效地做到这一点?

    2 回复  |  直到 16 年前
        1
  •  2
  •   Tom Anderson    16 年前

    这是一个快速实现。

        public static string SplitNameValuePairs(object value)
        {
            string retVal = string.Empty;
            List<string> keyValuePairs = new List<string>();
    
            foreach (var propInfo in value.GetType().GetProperties())
            {
                keyValuePairs.Add(string.Format("{0}:{1};", propInfo.Name, propInfo.GetValue(value, null).ToString()));
            }
    
            retVal = string.Join("", keyValuePairs.ToArray());
    
            return retVal;
        }
    

    然后这样叫:

            var person = new Person();
            person.Name = "Hello";
            person.Age = 10;
            Console.WriteLine(SplitNameValuePairs(person));
    
        2
  •  1
  •   okutane    16 年前

    当属性定义了索引器并且只输出实例属性(没有静态属性)时,它可以防止崩溃。

        private static string SplitNameValuePairs<T>(T value)
        {
            StringBuilder sb = new StringBuilder();
    
            foreach (PropertyInfo property in typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
            {
                if (property.GetIndexParameters().Length == 0)
                    sb.AppendFormat("{0}:{1};", property.Name, property.GetValue(value, null));
            }
            return sb.ToString();
        }