【问题标题】:Iterating over a NameValueMap in Autodesk Inventor在 Autodesk Inventor 中迭代 NameValueMap
【发布时间】:2018-02-16 11:21:39
【问题描述】:

我尝试使用基于 0 的索引对 NameValueMap 进行迭代,但没有成功。使用基于 1 的索引对其进行迭代是可行的。

没用。

public static void onParameterChange(_Document document,
                                     Inventor.Parameter parameter,
                                     EventTimingEnum BeforeOrAfter,
                                     NameValueMap context ,
                                     out HandlingCodeEnum handlingCode)
{
   handlingCode = HandlingCodeEnum.kEventHandled;

   // Did not work. Got an exception.
   for ( int i = 0; i < context.Count; ++i )
   {
      string name = context.Name[i];
      string value = (string)context.Value[name];
   }
}

工作。

public static void onParameterChange(_Document document,
                                     Inventor.Parameter parameter,
                                     EventTimingEnum BeforeOrAfter,
                                     NameValueMap context ,
                                     out HandlingCodeEnum handlingCode)
{
   handlingCode = HandlingCodeEnum.kEventHandled;

   // Worked.
   for ( int i = 1; i <= context.Count; ++i )
   {
      string name = context.Name[i];
      string value = (string)context.Value[name];
   }
}

我对此感到惊讶。这是预期的吗?

我还注意到NameValueMap 继承了IEnumerable。我尝试使用foreach 来获取NameValueMap 的项目。然而,这只给了我物品的价值。有没有办法同时获取项目的名称?

public static void onParameterChange(_Document document,
                                     Inventor.Parameter parameter,
                                     EventTimingEnum BeforeOrAfter,
                                     NameValueMap context ,
                                     out HandlingCodeEnum handlingCode)
{
   handlingCode = HandlingCodeEnum.kEventHandled;

   foreach ( var item in context )
   {
      // How do you get the name?
      string value = item;
   }
}

【问题讨论】:

  • 在 Autodesk Inventor 互操作世界中所有 Enumerables(实现 IEnumerable 的对象类型)都是从 1 开始的。不确定,这对于 COM-Interops 本身是否普遍适用......

标签: c# autodesk-inventor


【解决方案1】:

互联网上关于这个NameValueMap的信息很少,所以很难判断是否有现有的方法可以利用。

但是,您始终可以创建一个扩展方法来满足您的需求:

public static class NameValueMapExtensions
{
    public static IEnumerable<KeyValuePair<object, T>> AsEnumerable<T>(this NameValueMap map)
    {
        for (int i = 1; i <= map.Count; i++)
            yield return new KeyValuePair<object, T>(
                map.Name[i], (T)map.Values[map.Name[i]]);
    }
}

// ...

foreach (var item in context.AsEnumerable())
{
    // item.Key: Name
    // item.Value: ...
}

【讨论】:

  • 感谢您的回答。我是 C# 新手,需要一些时间来了解这一点。
  • @Xiaoy312,我已阅读有关 NameValueMaps 的 Autodesk 文档。您的线路:map.Name[i], (T)map.Values[i]); 应更改为:map.Name[i], (T)map.Value[map.Name[i]]); 以使其正常工作。另外我建议将泛型类型更改为object,因为NameValueMap 中的值可以是没有公共接口的类型。
  • 答案是根据提供的上下文编写的,因为我无权访问 Autodesk 库。实际上,值索引器应该是名称,而不是 i。至于 (T) 的类型,您始终可以使用AsEnumerable&lt;object&gt;(),这也让&lt;OtherTypeOption&gt;s 保持打开状态。
【解决方案2】:

由于 NameValueMaps 不包含很多元素,您也可以只返回一个完整的 Dictionary,而不是产生 KeyValuePair 元素。这使您可以访问一些方便的方法,例如.TryGetValue()。

public static class NameValueMapExtensions
{
    public static IDictionary<string, object> ToDictionary(this NameValueMap nameValueMap)
    {
        var dictionary = new Dictionary<string, object>();
        for (var i = 1; i <= nameValueMap.Count; i++)
            dictionary.Add(nameValueMap.Name[i], nameValueMap.Value[nameValueMap.Name[i]]);
        return dictionary;
     }
}

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2013-08-14
    • 2014-11-25
    • 2023-04-09
    • 2020-02-18
    • 2015-08-31
    • 2020-08-05
    • 2019-04-10
    • 2020-12-09
    相关资源
    最近更新 更多