使用C#中的反射检查Property是否为List
本文关键字:Property 是否 List 检查 反射 使用 | 更新日期: 2023-09-27 17:58:50
我目前正忙于输出对象的值。它们中的一些确实具有List<string>
属性,这会通过使用ToString()
方法造成问题。以下是我在基类中使用的代码,用于将属性的名称和值转换为字符串。
public override string ToString()
{
string content = "";
foreach (var prop in this.GetType().GetProperties())
{
if (prop.PropertyType is IList<string> && prop.GetType().IsGenericType && prop.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List<>)))
content += prop.Name + " = " + PrintList((List<string>)prop.GetValue(this));
else
content += prop.Name + " = " + prop.GetValue(this) + "'r'n";
}
content += "'r'n";
return content;
}
private string PrintList(List<string> list)
{
string content = "[";
int i = 0;
foreach (string element in list)
{
content += element;
if (i == list.Count)
content += "]";
else
content += ", ";
}
return content;
}
无论如何,检查属性是否为列表是无效的。这可能是一个愚蠢的问题,也可能是一种糟糕的反思方式,但我对它有点陌生,我会感谢任何帮助来弄清楚发生了什么。
public override string ToString()
{
StringBuilder content = new StringBuilder();
foreach (var prop in this.GetType().GetProperties())
{
var propertyType = prop.PropertyType;
var propertyValue = prop.GetValue(this);
if (propertyValue != null)
{
if (propertyValue is IEnumerable<string>)
content.AppendFormat("{0} = {1}", prop.Name, PrintList(propertyValue as IEnumerable<string>));
else
content.AppendFormat("{0} = {1}", prop.Name, propertyValue.ToString());
}
else
content.AppendFormat("{0} = null", prop.Name);
content.AppendLine();
}
return content.ToString();
}
private string PrintList(IEnumerable<string> list)
{
var content = string.Join(",", list.Select(i => string.Format("[{0}]", i)));
return content;
}
我会这么做;
var property = prop.GetValue(this);
// try to cast as IEnumerable<string> -- will set to null if it's not.
var propertyStrings = property as IEnumerable<string>;
if (propertyStrings != null) {
foreach(var s in propertyStrings) {
// do something here with your strings.
}
}
此外,不要使用+
运算符连接字符串,请查看StringBuilder
,它对内存和速度都更好。