我是C#的新手,使用C#3.0 需要创建未知数量的对象(不超过50个) 我的想法是将它们存储在ArrayList中,这样我就不必为它们命名,但仍然可以在需要时访问它们。 这些对象将具有一些已知属性,但它们需要具有与之关联的许多其他值。这个数字是未知的,但是很低,不到20-30就可以了。 不知道如何处理未知值。我可以将它们存储在与每个对象关联的数组中吗?但是我该怎么称呼他们呢? 或者这可以通过接口完成吗? 我读到了有关动态属性的信息,但3.0版本似乎不支持。
谢谢! -gg2
答案 0 :(得分:1)
我经常在我工作的领域中这样做。通常我创建一个包含已知值的对象,然后创建一个用于保存未知值的索引属性。该对象看起来像这样:
public class KindOfUnknown
{
private Dictionary<string, object> _metadata = new Dictionary<string, object>();
public object KnownValue1 { get; set; }
public object KnownValue2 { get; set; }
public object KnownValue3 { get; set; }
public object this[string propertyName]
{
get { return _metadata[propertyName]; }
set
{
_metadata[propertyName] = value;
}
}
public bool ContainsProperty(string propertyName)
{
return _metadata.ContainsKey(propertyName);
}
}
此处有3个已知属性,KnownValue1
,KnownValue2
和KnownValue3
。您可以使用有意义的名称和具体类型替换它们/根据需要添加或减去更多属性。
然后有一个索引器属性,允许您设置/获取存储在Dictionary<string, object>
中的未知值。你会这样称呼它:
var myObject = new KindOfUnknown();
myObject["MyCustomProperty"] = "Some value here"; //Does not have to be a string
myObject.KnownValue1 = SOME_VALUE;
这里唯一的缺点是您需要知道自定义属性中存储的内容。这些类型将被装箱并且可能存在一些性能问题,但我发现它的效果相对较好。
dynamic
将无法正常工作,因为正如您所发现的那样,它在C#3中不存在,即使它不适合使用它也是如此。你可以在C#4中得到的最接近的是从DynamicObject
派生一个类型,它允许你创建“动态”类型的属性。 dynamic
只是推迟检查“。”右侧的对象。存在直到运行时(表面上),它不允许您动态构造类型。
因此,为了创建一组未知数量的项目,您应该使用List<T>
,而不是ArrayList
,这是因为引入了泛型后实际折旧。要使用它,请创建一个新的:
List<KindOfUnknown> myObjects = new List<KindOfUnknown>();
然后你可以添加它们:
myObjects.Add(new KindOfUnknown() { KnownValue1 = ... });
你也可以像任何其他数组一样使用索引器和for-each循环。使用List<T>
优于ArrayList
的优点是对象不会在内存中装箱。
答案 1 :(得分:0)
您可以尝试在每个对象上保留一个字典,链接到您可能需要的未知属性。