C#,3.0,如何将未知数量的值与对象相关联

时间:2015-05-28 17:27:30

标签: c#

我是C#的新手,使用C#3.0 需要创建未知数量的对象(不超过50个) 我的想法是将它们存储在ArrayList中,这样我就不必为它们命名,但仍然可以在需要时访问它们。 这些对象将具有一些已知属性,但它们需要具有与之关联的许多其他值。这个数字是未知的,但是很低,不到20-30就可以了。 不知道如何处理未知值。我可以将它们存储在与每个对象关联的数组中吗?但是我该怎么称呼他们呢? 或者这可以通过接口完成吗? 我读到了有关动态属性的信息,但3.0版本似乎不支持。

谢谢! -gg2

2 个答案:

答案 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个已知属性,KnownValue1KnownValue2KnownValue3。您可以使用有意义的名称和具体类型替换它们/根据需要添加或减去更多属性。

然后有一个索引器属性,允许您设置/获取存储在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)

您可以尝试在每个对象上保留一个字典,链接到您可能需要的未知属性。