我想创建一个将从一个方法传递给另一个方法的数据列表,但是我不能使用结构,因为此列表中包含的数据会因输入而异。
例如
if (x == 1) {
a = 1
b = true
c = 42
d = "hello"
}
if (x == 2) {
a = 2
b = 'g'
c = "sup"
}
我相信我的选择是:
我的问题是,哪些选项最好?或者是否有一种替代选项使用某种我不知道的泛型类型?每种情况下可能的变量数量可能会发生变化,就像它们的类型一样。我希望能够将单个List或Array返回给调用方法,以便它可以适当地处理结果。它将知道如何根据a的值处理每组数据,因为它将是“动作选择”标识符。我也知道每次将它们投射到物体上并且非常密集,所以我宁愿避免这种情况。
这可能很简单,但让我难过......
答案 0 :(得分:4)
答案 1 :(得分:3)
.NET中的一般原则是每个类型都可以强制转换为System.Object(尽管它可能涉及装箱)。您可以使用
之类的方法void Foo(params object[] parameters) { ... }
或使用System.Collections.ArrayList类。
“问题”是,当您想要使用这样的值时,您将需要以下代码:
if (parameters[i] is string)
{
string s = (string) parameters[i];
...
}
答案 2 :(得分:2)
抱歉,这不是与代码相关的答案:可能是隐藏在此类构造背后的错误设计。确保你知道自己在做什么,否则事情可能会重新开始。
如果不知道您事先使用的字段类型确实是必需的,则需要一种方法来保存数据类型,例如
struct foo {
private object _value;
private string _type;
foo(string myType, object myValue) {
_value = myValue;
_type = myType;
}
}
然后使用Generics处理业务逻辑。
答案 3 :(得分:2)
基本上你需要一个输入到Object的列表,然后是的,你处于一种退回模式。
我的问题是,从结构上讲,您如何知道哪种类型的索引?这听起来像是一个痛苦的解决方案。
如果确实需要在列表中存储不同的类型,可以尝试包含每种类型成员的结构,以及指示表示哪种数据类型的标志。然后使用该结构的泛型集合。像(在我头顶)的东西
struct FooType
{
public string StringValue;
public bool BoolValue;
public int IntValue;
public char CharValue;
public string DataType;
// You'd probably want constructors too
}
然后是通用列表:
var values = new List<FooType>();
现在,您可以使用该类型添加和删除列表中的条目,这将指示核心数据的真实含义。
我仍然不喜欢这个答案;听起来你的设计可能会尝试做太多而且可能会有重构机会,但由于我没有看到更多的代码或意图,我所能做的只是回答你的问题。 :)
答案 4 :(得分:1)
您可以使用Dictionary/Hashtable
表示数据项,然后将这些词典添加到List
。
如果需要,您还可以在字典值中添加额外的类型信息。