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

时间:2009-01-14 16:33:54

标签: c# generics reflection

例如,我有一个简单的类,如

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

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

我正在寻找

行上的方法签名
public string SpitNameValuePairs<T>() 

或类似的东西。如果使用反射,如何才能有效地完成?

2 个答案:

答案 0 :(得分:2)

这是一个快速实施。

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

答案 1 :(得分:1)

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

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