C# 创建依赖于字符串值的类型列表
假设我有一个.txt文件,其中:C# 创建依赖于字符串值的类型列表,c#,generics,C#,Generics,假设我有一个.txt文件,其中: 第一个单词是类(甚至是用户定义的类)的类型或名称。所以它可以是编译器接受的任何东西 以下文字是该类型的值 例如: int 1 2 3 5 6 8 19 20 如何创建c#中第一个单词类型的列表?这类东西显然是非法的,但我还是要写出来,以明确我需要什么: static void Main(string[] args) { System.IO.StreamReader file = new Syst
int 1 2 3 5 6 8 19 20
如何创建c#中第一个单词类型的列表?这类东西显然是非法的,但我还是要写出来,以明确我需要什么:
static void Main(string[] args)
{
System.IO.StreamReader file =
new System.IO.StreamReader(@"c:\test.txt");
string[] words = reader.ReadToEnd().Split(' ');
List<words[0]> list = new List<words[0]>;
}
static void Main(字符串[]args)
{
System.IO.StreamReader文件=
新System.IO.StreamReader(@“c:\test.txt”);
string[]words=reader.ReadToEnd().Split(“”);
列表=新列表;
}
即使这是可能的,操作list.add(word[i])
也应该是一个问题(因为每个元素也是一个字符串)
重要提示:项目细节中不允许反射,因为性能很差 在C#中,如果不涉及某种方式的运行时反射,就无法做到这一点 也许最实用的方法是使用
dynamic
:
var t = typeof(int); // or some other type based on the input
dynamic list = Activator.CreateInstance(typeof(List<>).MakeGenericType(t));
var t=typeof(int);//或基于输入的其他类型
动态列表=Activator.CreateInstance(typeof(list).MakeGenericType(t));
然后,您可以简单地使用list.Add(x)
,其中x
是一个适当类型的值——但您也必须以某种方式将输入转换为该类型——您不能只添加从文件中读取的字符串
后者可能比创建和使用列表本身更难解决:如何将字符串(通常从文件中读取)转换为用户指定的任意类型的值?我强烈建议不要尝试这样做,至少有你说的完全不受约束的要求
至少有几个小问题是可以解决的:
Expression
s构建缓存的反序列化对象,可以最大限度地减少性能问题(这将确保在实际处理数据时尽可能获得最佳性能)int
不是实际的.NET类型名称。您必须使用特殊情况的C类型别名,如int
,bool
,long
,等等,才能使其起作用AppDomain
来说,完全有可能将多个类型命名为Point
。没有名称空间,就无法有效地解决歧义AppDomain
的输入poi引用的程序集中包含的类型nt程序集。若要处理间接引用的程序集,您需要递归搜索程序集类型以查找您要查找的类型名称。显然,无法处理未知程序集中的类型列表
类型的变量,那么对某些特定类型使用列表
通常是非常不方便的e读取的特定类型