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