我试图简化我的方法,在一个函数中创建多个变量,这些变量针对不同的类型和不同的动作重复,最终我将迁移到一个可以处理多种类型的函数,但我分阶段进行。我希望能够在其类型中而不是 List 中创建对象列表,而不必在任何地方复制/粘贴对象类型。我曾希望通过一些非常简单的事情来实现这一点
Type t = typeof(LinkAddy);
var x = List<t>();
但这不会编译。
然后我尝试了以下答案提供的不同解决方案:Storing variable type and using it to create collections at runtime
static IList createGenericList(Type typeInList) {
var genericListType = typeof(List<>).MakeGenericType(new[] { typeInList });
return (IList)Activator.CreateInstance(genericListType);
}
和
static List<T> createGenericList<T>() {
List<T> genericListType = new List<T>();
return genericListType;
}
所以这里是不同的方法及其结果:
Type ThisType = typeof(LinkAddy);
// The normal list method, means I have to copy/paste LinkAddy everywhere
var fromQuery = new List<LinkAddy>();
// Makes a List, but I still have to put LinkAddy
var fromQuery_IsNew = createGenericList<LinkAddy>();
// Provides a List, I don't have to place LinkAddy
// but its a List<object> and not List<LinkAddy> so wherever I use
// the objects, I'll have to cast the object like
// string title = (fromQuery_IsDiff[0] as LinkAddy).Title;
var fromQuery_IsDiff = createGenericList(ThisType);
编辑:最终,我不会在运行时知道类型,该函数将成为通用函数,因此我可以将 LinkAddy 作为类型或其他类型传递,它会根据需要生成列表。第一步只是在整个函数中使用泛型,然后检查类型是否需要更具体。这是一个包含大约 200 行代码的大型函数的一部分,这些代码与数据库同步的列表验证检查有关(它确定缓存和服务器版本中的哪个更新,无论哪个更新,如果您有权这样做)。我有多个类似于 LinkAddy 的类,它们使用 WCF RIA 服务和 SilverLight 同步到服务器上的 SQL 数据库。这些条目还存储在一个执行 XML 序列化并将 XML 文件保存给用户的类中 s 系统(缓存)。这使我在现场的代理可以在没有互联网连接的情况下访问我的大部分站点数据,就像他们在客户面前经常遇到的情况一样。