我有许多存储在列表中的类。我正在尝试创建一个接受List作为泛型类型的方法,并将相应列表中每个元素的内容作为字符串返回。
这是许多课程之一的样本。这将被定义为List< Player>:
public class Player
{
public int PlayerId { get; set; }
public string PlayerName { get; set; }
public string FavoriteThing { get; set; }
}
我仍然在努力使语法正确:
public static string GetStringOfData<T>(List<T> data)
{
string dataString = string.Empty;
var type = data.GetType();
// Insert magic here to get values for PlayerId, PlayerName, etc...
return dataString;
}
我们怎样才能实现这一目标?我正在使用C#4.0。
更新 我正在使用的类是从edmx模型生成的,连接到数据库。这是一个报告工具,它将解析各种表并通过电子邮件向用户报告错误。用户特别要求能够查看所有字段的内容。
答案 0 :(得分:5)
每种类型都会继承ToString
中的object
方法。在您的课程中覆盖ToString
。
public class Player
{
...
public override string ToString()
{
return String.Format("Player [ID = {0}, Name = {1}]",
PlayerId, PlayerName);
}
{
然后,您可以使用非通用IEnumerable
来处理它们。 (如果您可以与List<T>
享用免费午餐,为什么要限制自己为IEnumerable
?后者适用于List<T>
,数组,SortedLists<T>
,HashSet<T>
,{ {1}} IEnumerbale<T>
的算法实现完全不基于集合,...)
IEnumerable
这适用于几乎任何类型的集合。
注意:覆盖public static string GetStringOfData(IEnumerable data)
{
var sb = new StringBuilder();
foreach (object o in data) {
sb.Append(o).Append("; ");
}
if (sb.Length >= 2 ) {
sb.Length -= 2;
}
return sb.ToString();
}
会产生积极的副作用,调试器会向您显示此字符串,而不是仅显示类型名称。
答案 1 :(得分:2)
您应该能够执行以下操作:
foreach(T item in data)
{
var props = item.GetType().GetProperties();
foreach(var prop in props)
{
dataString += prop.GetValue(item, null);
}
}
答案 2 :(得分:1)
在这里结合选择。
您可以让所有类都实现某些界面,例如
IDataString
包括从对象获取字符串数据的方法。然后你的方法可以接受那些列表,并返回一个字符串:
public static string GetStringOfData(List<IDataString> data)
{
StringBuilder sb = new StringBuilder();
foreach(var dm in data)
{
sb.append(dm.InterfaceMethod());
}
return sb.ToString()
}
您还可以在所有对象中覆盖ToString,并只接受对象列表。代码类似。这假设您不介意丢失正常的ToString功能。
你可以用refelction做到这一点,我认为这就是你在问题中所追求的,但是你只是要连接所有的公共字符串字段?这有点慢,而且更难看,但可以肯定。
答案 3 :(得分:1)
首先在每个类中覆盖ToString()
方法:
public class Player
{
public int PlayerId { get; set; }
public string PlayerName { get; set; }
public string FavoriteThing { get; set; }
public override string ToString()
{
return this.PlayerId.Tostring() + " " + PlayerName + " " + FavoriteThing;
}
}
然后在你的方法中连接所有从类实例返回的字符串:
public static string GetStringOfData<T>(List<T> data)
{
StringBuilder dataBuilder = new StringBuilder();
foreach (object o in data)
{
dataBuilder.Append(o.ToString());
dataBuilder.Append(" ");
}
return dataBuilder.ToString();
}
请注意,由于性能问题,最好使用StringBuilder
连接字符串。
答案 4 :(得分:0)
您期望的魔力可能是反射:在运行时确定属性并获取列表中每个项目的值。
以下代码如下:
public static string GetStringOfData<T>(List<T> list)
{
var stringBuilder = new StringBuilder();
var properties = typeof(T).GetProperties()
.Where(p => !p.GetIndexParameters().Any());
foreach (var item in list)
{
foreach (var propertyInfo in properties)
{
stringBuilder.AppendFormat("{0}={1};",
propertyInfo.Name,
propertyInfo.GetValue(item, null));
}
stringBuilder.AppendLine();
}
return stringBuilder.ToString();
}