Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时使用类型变量创建类型列表_C#_List_Generics_Dynamic_Types - Fatal编程技术网

C# 在运行时使用类型变量创建类型列表

C# 在运行时使用类型变量创建类型列表,c#,list,generics,dynamic,types,C#,List,Generics,Dynamic,Types,我试图简化在一个函数中创建多个变量的方法,该函数会针对不同的类型和不同的操作重复,最终我会迁移到一个可以处理多种类型的函数,但我会分阶段进行。我希望能够创建对象类型的列表,而不是列表,而不必到处复制/粘贴对象类型。我曾希望通过一些非常简单的方法来实现这一点,比如 Type t = typeof(LinkAddy); var x = List<t>(); Type t=typeof(LinkAddy); var x=List(); 但这并没有编译 然后,我尝试了以下答案提供的不同解

我试图简化在一个函数中创建多个变量的方法,该函数会针对不同的类型和不同的操作重复,最终我会迁移到一个可以处理多种类型的函数,但我会分阶段进行。我希望能够创建对象类型的列表,而不是列表,而不必到处复制/粘贴对象类型。我曾希望通过一些非常简单的方法来实现这一点,比如

Type t = typeof(LinkAddy);
var x = List<t>();
Type t=typeof(LinkAddy);
var x=List();
但这并没有编译

然后,我尝试了以下答案提供的不同解决方案:

静态IList createGenericList(类型typeInList){
var genericListType=typeof(List).MakeGenericType(new[]{typeInList});
return(IList)Activator.CreateInstance(genericListType);
}

静态列表createGenericList(){
List genericListType=新列表();
返回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);
Type ThisType=typeof(LinkAddy);
//普通的列表方法,意味着我必须在任何地方复制/粘贴LinkAddy
var fromQuery=新列表();
//列出一个清单,但我还是要把LinkAddy
var fromQuery_IsNew=createGenericList();
//提供一个列表,我不必放置LinkAddy
//但这是一个列表,而不是列表,所以无论我在哪里使用
//对象,我必须像这样投射对象
//字符串title=(作为LinkAddy的fromQuery_IsDiff[0]);
var fromQuery_IsDiff=createGenericList(此类型);

编辑:最终,我在运行时不知道该类型,该函数将被设置为泛型,以便我可以将LinkAddy作为一个类型或其他类型传递,并根据需要生成列表。第一步是在整个函数中使用泛型,并且检查类型中需要更具体的内容。这是一个大型函数的一部分,该函数包含大约200行代码,这些代码与数据库同步的列表验证检查有关(它确定哪些缓存版本和服务器版本较新,如果您有权限,则向另一个发布覆盖)。我有多个类似于LinkAddy的类,它们使用WCF RIA服务和SilverLight同步到服务器上的SQL数据库。这些条目还存储在一个进行XML序列化的类中,并将XML文件保存到用户的系统(缓存)。这使得我在现场的代理可以在没有互联网连接的情况下访问我的大部分网站数据,这对于他们在客户面前通常都是如此。

您不太清楚这可能如何工作,特别是考虑到以下评论:

// 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
//但这是一个列表,而不是列表,所以无论我在哪里使用
//对象,我必须像这样投射对象
//字符串title=(作为LinkAddy的fromQuery_IsDiff[0]);
如果您足够了解如何转换到
LinkAddy
(作为转换比使用
as
,IMO更好),那么您在编译时就清楚地知道了类型。如果您在编译时知道类型,只需将其作为类型参数提供即可

当您在编译时不知道所涉及的类型时,像
MakeGenericType
这样的东西很有用,这意味着您不能强制转换。。。而且你不能使用任何你知道的关于类型的其他东西

您可以使用动态类型来代替。。。但是,如果您知道将有一个
Title
属性,那么您真正想要的可能是一个接口,以表达公共性。然后,您可以潜在地使用对该接口具有约束的泛型方法

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

您已经概述了这些选项(您在这里看到的几乎都是可用的)。问题是什么?
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);
// 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;