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

C# 如何创建一个接受任何对象并为所有属性返回名称:值对的方法?,c#,generics,reflection,C#,Generics,Reflection,例如,我有一个简单的类,如 public class Person{ public int Age {get;set;} public string Name {get;set;} } 我需要创建一个方法,该方法接受任何类,并以“Age:35;Name:johndoe 我正在寻找一个方法签名的行 public string SpitNameValuePairs<T>() publicstringname-valuepairs() 或者类似的。如果使用反射,如

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

public class Person{ 
    public int Age {get;set;}
    public string Name {get;set;}
}
我需要创建一个方法,该方法接受任何类,并以“Age:35;Name:johndoe

我正在寻找一个方法签名的行

public string SpitNameValuePairs<T>() 
publicstringname-valuepairs()

或者类似的。如果使用反射,如何有效地实现这一点?

下面是一个快速实现

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

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

私有静态字符串SplitNameValuePairs(T值)
{
StringBuilder sb=新的StringBuilder();
foreach(typeof(T).GetProperties中的PropertyInfo属性(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
if(property.GetIndexParameters().Length==0)
sb.AppendFormat(“{0}:{1};”,property.Name,property.GetValue(value,null));
}
使某人返回字符串();
}

如果您只是将其作为一个扩展方法,则不需要泛型键入。我只是想到了几乎完全相同的实现。唯一的问题是我听说这个速度非常慢(如果我记得正确的话,速度会慢10-1000倍)。这也只处理简单属性(即未索引,这是GetValue的null参数所做的)。如果解决方案不完整,则应添加索引器检查和静态属性筛选。因为GetProperties()返回数组,所以可以使用array.ConvertAll,这会更快。
        var person = new Person();
        person.Name = "Hello";
        person.Age = 10;
        Console.WriteLine(SplitNameValuePairs(person));
    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();
    }