我有一个小问题给你们。
我想这样做:
Type[] classes = new Type[]{ Class1, Class2 };
foreach(Type t in classes){
List<t> list = new List<t>();
}
有什么办法吗?
我有一个小问题给你们。
我想这样做:
Type[] classes = new Type[]{ Class1, Class2 };
foreach(Type t in classes){
List<t> list = new List<t>();
}
有什么办法吗?
您在运行时不能投放“ 强” / " 强 " 至通用类型, 因为通用类型需要在编译时解决 。
您的“ 坚固” 可以使用反射以动态方式创建通用类型, 但除非您对投影进行硬编码, 否则您得到的回报只能是一个对象 。
我实在不知道你想要什么,我不得不同意一个评论,这就是一个XY问题 。我倾向于冒昧地说,在某个地方,设计问题正在试图解决,而不是直接解决设计问题,或者询问你试图直接实现什么的问题。
您可以使用以下代码创建类型, 然后 动力
类型可以用于 < a href=" http:// en.wikipedia.org/wiki/Duck_typing" rel= "nofollow" > duck 类型 中的各个成员 List<T>
, 而不知道/ 显示它是一个列表或什么是 T
:
using System;
using System.Collections.Generic;
namespace ConsoleApplication61
{
class Program
{
static void Main(string[] args)
{
dynamic o = CreateGeneric(typeof(List<>), typeof(int));
o.Add(1);
Console.WriteLine(o[0]);
Console.Read();
}
public static object CreateGeneric(Type generic, Type innerType, params object[] args)
{
System.Type specificType = generic.MakeGenericType(new System.Type[] { innerType });
return Activator.CreateInstance(specificType, args);
}
}
}
上述样本鸭类型为 Add
方法和索引。 DLR在运行时进行类型处理和鸭键入,例如知道 1
是 int
。
为了澄清,我可能不会在生产中使用这种代码(除非你的要求非常具体,需要这样做),而任何与类型匹配有关的问题都会在运行时发生;所以你要么需要非常准确地输入(Intellisense)或者有良好的错误处理。
http://geekswithblogs.net/marcel/archive/2007/03/24//109722.aspx" rel="nofollow" 的博客文章 表示 CreateGeneric
方法。
这个假设是.NET 4 与新的 CLR。 正如@ MartinLiversage 也指出的, 这个特定样本假设您正在以某种强烈类型的方式使用列表。 例如, 我正将 < code>int code > 转到 < code>List<int> 隐藏在 < code > 动力 中的 。
我们几乎从... NET 4 发布以来就一直在.NET 4上。我们有一个大应用程序,其代码基础甚至更大。在应用程序中, directive
一次没有被使用,在测试代码基础中也只使用过几次。这不是说"不要使用它",而是说"大部分时间,你不需要它"。
你可以做到这一点:
foreach(Type t in classes)
{
var listType = typeof(List<>).MakeGenericType(t);
var instance = Activator.CreateInstance(listType);
}
使用"
这里我找到了一种适合你们使用的方法:CodeRef
public static object CreateGeneric(Type generic, Type innerType, params object[] args)
{
System.Type specificType = generic.MakeGenericType(new System.Type[] { innerType });
return Activator.CreateInstance(specificType, args);
}
并用它像这样:
var o = CreateGeneric(typeof(List<>), t);
不幸的是,要添加项目,你不得不这样做(如果项目是您要添加的项目) 。
MethodInfo addMethod = o.GetType().GetMethod("Add");
addMethod.Invoke(o, new object[] { item.ToType(t) });
或者使用另一个回答中提到的 < code> Generic 类型。
你可以试试这个:
Type[] classes = new Type[] { typeof(A), typeof(B) };
foreach (Type t in classes)
{
Type genericType = typeof(List<>).MakeGenericType(t);
var list = Activator.CreateInstance(genericType);
}
如果您想要保留到一个列表中的对象, 那么它们可能有共同点 。
在这种情况下,我要争辩说,正如L.B.在评论中提到的那样,你在这里提出一个错误的问题。
可能是您有的设计问题。 想想这些类型, 看看它们有什么共同之处, 看看它们有什么共同之处, 并且想着从一个基类型中产生, 或者让两者都执行同一个界面。 在这种情况下, 您就可以对一个基类型/ 界面对象的列表进行即时处理, 并与这些对象一起工作 。
只是想给你一个开始:
abstract class Vehicle {
public int NumberOfWheels { get; set; }
}
class Car : Vehicle
{
public Car()
{
NumberOfWheels = 4;
}
}
class Bicycle : Vehicle
{
public Bicycle()
{
NumberOfWheels = 2;
}
}
static void Main(string[] args)
{
var v1 = new Car();
var v2 = new Bicycle();
var list = new List<Vehicle>();
list.Add(v1);
list.Add(v2);
foreach (var v in list)
{
Console.WriteLine(v.NumberOfWheels);
}
Console.ReadKey();
}
What is the use of default keyword in C#? Is it introduced in C# 3.0 ?
I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...
I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...
I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...
I have two EF entities. One has a property called HouseNumber. The other has two properties, one called StartHouseNumber and one called EndHouseNumber. I want to create a many to many association ...
How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...
Since I cannot order my dictionary, what is the best way of going about taking key value pairs and also maintaing an index?
Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...