【问题标题】:Fetch a value of a property of an object in ArrayList获取 ArrayList 中对象的属性值
【发布时间】:2014-12-24 02:34:34
【问题描述】:

我已经在 C# 中为 Windows 窗体应用程序初始化了一个 ArrayList。我在ArrayList 中添加了每个对象的属性很少的新对象,例如:

ArrayList FormFields = new ArrayList();

CDatabaseField Db = new CDatabaseField();
Db.FieldName = FieldName; //FieldName is the input value fetched from the Windows Form
Db.PageNo = PageNo; //PageNo, Description, ButtonCommand are also fetched like FieldName
Db.Description = Description;
Db.ButtonCommand = ButtonCommand;
FormFields.Add(Db);

现在当我只想检查ArrayList 中每个对象的FieldName 时(假设ArrayList 中有很多对象)。我该怎么做??

我试过了:

for(int i=0; i<FormFields.Count; i++) 
{
    FieldName = FormFields[i].FieldName;
}

但这会产生错误(在 IDE 中)。我是 C# 编程新手,有人可以帮我吗?

错误:错误 21 'object' 不包含 'FieldName' 的定义 并且没有扩展方法“FieldName”接受类型的第一个参数 可以找到“对象”(您是否缺少 using 指令或 汇编参考?)

【问题讨论】:

  • 你能用CDatabaseField的列表代替数组列表吗?
  • Recipe OP's 最好的办法是实际创建一个 CDatabaseField 列表,正如Selman22 所指出的那样..List&lt;CDatabaseField&gt;
  • Daniel,实际上我正在开发一个旧软件,它实现了名为 FormFields 的数组列表来存储 CDatabaseField 的列表,该列表已在软件中的数千个地方使用。要将 arraylist 更改为列表,我需要在很多地方进行更改,目前这是不可行的。你能建议我一种从数组列表中保存的对象中获取特定字段名的方法吗??

标签: c# .net arraylist


【解决方案1】:

ArrayList 持有对象。它不是通用的和类型安全的。这就是为什么你需要转换你的对象来访问它的属性。而是考虑使用像List&lt;T&gt; 这样的通用集合。

var FormFields = new List<CDatabaseField>();
CDatabaseField Db = new CDatabaseField();
...
FormFields.Add(Db);

然后您可以看到所有属性都将可见,因为现在编译器知道您的元素的类型并允许您以类型安全的方式访问您的类型的成员。

【讨论】:

  • 我现在尝试了这种方法,但 'var' 在 Visual Basic 中生成错误:错误 1 ​​找不到类型或命名空间名称 'var'(您是否缺少 using 指令或程序集参考?)
  • Selman22,实际上我正在开发一个旧软件,它实现了名为 FormFields 的数组列表来存储 CDatabaseField 的列表,该列表在软件中的数千个地方使用。要将 arraylist 更改为列表,我需要在很多地方进行更改,目前这是不可行的。你能建议我一种从数组列表中保存的对象中获取特定字段名的方法吗??
【解决方案2】:

终于找到答案了。 我尝试为 arraylist 中保存的每个对象转换对象,最后可以获取每个对象的必填字段:

for (int i = 0; i < FormFields.Count; i++)
{
     CDatabaseField Db = (CDatabaseField)FormFields[i];
     Label1.Text = Db.FieldName; //FieldName is the required property to fetch
}

【讨论】:

    【解决方案3】:

    正如已经指出并基于this:

    Item 返回Object,因此您可能需要转换返回值 到原始类型以对其进行操作。重要的是要 请注意,ArrayList 不是强类型集合。为一个 强类型替代方案,请参阅List&lt;T&gt;。

    但是,作为另一种选择,您可以使用foreach 循环而不是for。当foreach 运行时,它会尝试将ArrayList 的cast 元素转换为CDatabaseField,如果元素不能转换为CDatabaseField,您将获得InvalidCastException:

    foreach (CDatabaseField item in FormFields)
    {
        FieldName = item.FieldName;
    }
    

    根据foreachdocumentation和C#6语法,上面的代码等价于:

    var enumerator = FormFields.GetEnumerator();
    try
    {
        while (enumerator.MoveNext())
        {
            CDatabaseField item = (CDatabaseField)enumerator.Current;
        }
    }
    finally
    {
        var disposable = enumerator as IDisposable;
        disposable?.Dispose();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 2020-03-02
      • 2019-11-13
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      相关资源
      最近更新 更多