【发布时间】:2021-05-26 20:17:06
【问题描述】:
假设我们有一个带有泛型数组的 Container 类
public class Container<T>
{
public T[] ObjectArray = new T[];
}
public class PlayerInfo
{
public int level;
public string playerName;
public string description
}
public class EnemyInfo
{
public string enemyName;
}
现在我的应用中有Container<PlayerInfo> 和Container<EnemyInfo>,它们有很多玩家/敌人数据。
我想创建一个List来处理我的应用程序中的所有Container,并打印出所有string类型的字段,我该如何实现呢?
以上面的例子我要打印出playerNamedescriptionenemyName。
我试过是这样的。
//let container inherit from a class
public class Container<T> : BaseClass
{
public T[] ObjectArray = new T[];
}
//so that I could add them to a single list.
var list = new List<BaseClass>();
list.Add(playerContainerInstance);
list.Add(enemyContainerInstance);
foreach(var element in list)
{
//and what should I do now to get string field from it?
}
现在我可以弄清楚是用反射做一些事情,但也许还有另一种方法可以做到这一点?
【问题讨论】:
-
我认为更好的方法是不要使用无意义的超泛型容器类。如果你需要一个收藏来持有
PlayerInfos,声明一个;如果出于某种原因必须将多个不同类型的容器存储在一个地方,则可以有一个类来保存多个类型化的属性(每个属性本身都可以是容器、字典或诸如此类的东西)。我很难想出在哪些实际场景中存储多个容器是有意义的,每个容器都有不同的、不兼容的类型,并且仍然有意义地处理它们。 -
至于打印字符串的一般机制:您可以强制执行类应该覆盖
.ToString()以提供有意义的表示的约定,然后调用它;这有利于为任何object工作。编写一个通用的.ToString()使用反射来输出所有属性值也不是太难,所以如果你不想的话,你不必为每个类都重做。
标签: c# generics reflection