假设我有一个.txt文件,其中:
举个例子:
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]>;
}
即使这是可能的,操作list.add(word[i])
应该是一个问题(因为每个元素也是一个字符串)!
重要提示:项目细节中不允许反射,因为性能不佳!
答案 0 :(得分:2)
你不能在C#中做到这一点而不涉及某种方式的运行时反射。
也许最接近你所要求的事情的最实际的方法是使用dynamic
:
var t = typeof(int); // or some other type based on the input
dynamic list = Activator.CreateInstance(typeof(List<>).MakeGenericType(t));
然后您可以简单地使用list.Add(x)
x
是相应类型的值 - 但您必须以某种方式将输入转换为该类型 - 您不能只是添加从文件中读取的字符串。
后者是一个问题,或许比创建和使用列表本身更难解决:如何将字符串(这是您总是从文件中读取的内容)转换为用户指定的某种任意类型的值?
答案 1 :(得分:0)
我会强烈建议不要尝试这样做,至少在你已经说过完全不受约束的要求时。
至少有一些轻微的,可解决的问题:
Expression
来构建缓存的反序列化对象(这将确保最佳性能)实际处理数据时。)还有一些更为重要的问题(即极难或无法解决):
int
不是实际的.NET类型名称。您需要使用特殊情况下的C#类型别名,例如int
,bool
,long
等,才能实现这一点。AppDomain
有多个名为Point
的类型,这是完全可能的。没有命名空间,就无法有效解决歧义。AppDomain
入口点程序集引用的程序集中包含的类型。要处理间接引用的程序集,您需要递归搜索程序集类型以查找您正在查找的类型名称。显然,无法处理未知程序集中的类型。List<T>
类型的变量,那么对某些特定类型使用List<T>
通常会非常不方便。< / LI>
System.String
,您希望输入文本的外观。如果任何字符串值本身都有空格,那么它将被误认为是值分隔符,在解析数据时会破坏它。通过约束问题可以解决上述一些问题。例如,要求每种类型实现静态Parse()
方法,要求每个类型由进程中的一个程序集引用,限制类型的可能值,或提供用于分隔或以其他方式格式化值的其他规则在文中等等。但这些只有在您愿意退出您在问题中规定的原始广泛规范时才有效。
理想情况下,您只需提前知道可能需要解析哪些类型,然后为每种类型编写特定代码。这是最可靠的,虽然更耗时。
可能在您的方案中使用的此主题的变体是使用Managed Extensibility Framework (MEF)(或类似技术)来提供加载项机制,其中提供了特定于类型的加载项,这些加载项知道如何解析一行输入。每个加载项都会发布一个名称(不一定是实际的真实类型名称......它只需要是唯一的),然后您的程序将检索相应的加载项以根据在此处提供的唯一名称解析该行。该行的开头(如您的示例所示)。
底线:如上所述,按照字面意思采用规范,这不能以任何合理的方式完成。
您必须至少在某种程度上限制要求的范围,以促进实际的解决方案。如果你确实限制了你的要求范围,我已经提供了一些关于如何工作的一般指导。如果您无法确定如何解决问题,请随时询问有关问题各个部分的新问题。