3

我试图简化我的方法,在一个函数中创建多个变量,这些变量针对不同的类型和不同的动作重复,最终我将迁移到一个可以处理多种类型的函数,但我分阶段进行。我希望能够在其类型中而不是 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 系统(缓存)。这使我在现场的代理可以在没有互联网连接的情况下访问我的大部分站点数据,就像他们在客户面前经常遇到的情况一样。

4

1 回答 1

2

目前还不清楚你期望这可能如何工作,特别是考虑到评论:

// 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;

如果您足够了解要转换为LinkAddy作为转换比使用asIMO 更好),那么您在编译时就清楚地知道类型。如果您在编译时知道类型,只需将其作为类型参数提供。

当您不知道编译时涉及的类型时,类似的东西MakeGenericType很有用,这意味着您不能强制转换......并且无论如何您都不能使用您所知道的有关该类型的任何其他东西。

您可能会使用动态类型来代替......但是如果您知道会有一个Title属性,那么您真正想要的也许是一个接口,而不是表达共性。然后,您可能会使用对该接口有约束的泛型方法。

无论如何,您应该考虑在编译时您知道哪些事情,以及哪些事情仅在执行时才知道。在大多数情况下,泛型针对的是在编译时已知的类型......虽然在执行时通过反射使用泛型是可能的,但它有点违背设计,所以当它令人沮丧时你不应该感到惊讶。

于 2013-03-13T23:38:28.173 回答