Динамическое получение значений переменных и аргументов для NativeActivity - PullRequest
0 голосов
/ 28 февраля 2020

Когда я запускаю приведенный ниже код (C#) как пользовательское действие (скомпилированный .dll добавляется в пакет nuget и запускается в последовательности UiPath с некоторыми пользовательскими переменными / аргументами. Я могу получить имя переменная и ее тип, но я не могу найти правильный синтаксис для получения значения (я просто хочу преобразовать его в строку, нет необходимости делать что-либо причудливое). Я могу получить доступ к некоторым свойствам, поэтому я знаю, что я близок Я приложил все усилия, чтобы прочитать документы, но в этом случае, для меня это может быть два абстрактных. Я прошел через многие взаимодействия и отыскивал как можно больше inte rnet, но не могу показаться чтобы понять это.

using Newtonsoft.Json.Linq;
using System;
using System.Activities;
using System.Activities.Hosting;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;

namespace AutoLog
{
    public sealed class GetRootActivity : NativeActivity
    {
        public OutArgument<string> variables { get; set; }

        protected override void Execute(NativeActivityContext context)
        {

            this.variables.Set((ActivityContext)context, Library.getLocalVariables(context));
        }

        protected override void CacheMetadata(NativeActivityMetadata metadata)
        {
            base.CacheMetadata(metadata);
            metadata.AddDefaultExtensionProvider<GetRootActivity.WorkflowInstanceInfo>((Func<GetRootActivity.WorkflowInstanceInfo>)(() => new GetRootActivity.WorkflowInstanceInfo()));
        }

        public class Library
        {
            public static string getLocalVariables(NativeActivityContext context)
            {
                var properties = context.DataContext.GetProperties();
                JArray variables = new JArray();
                foreach(PropertyDescriptor p in properties)
                {
                    JObject variable = new JObject();
                    variable["name"] = p.Name;
                    variable["type"] = p.PropertyType.ToString();
                    string string_value = "";
                    try
                    {
                        var myValue = context.DataContext.GetType().GetProperty(p.Name).GetValue(context.DataContext, null);
                        string_value = myValue.ToString();
                    }
                    catch(Exception e)
                    {
                    }
                    variable["value"] = string_value;
                    variables.Add(variable);
                }

                return variables.ToString();
            }
        }
    }
}

Ниже приведен пример JSON, который он генерирует, как вы можете видеть, поле «значение» пусто

[
  {
    "name": "a",
    "type": "System.String",
    "value": ""
  },
  {
    "name": "b",
    "type": "System.Boolean",
    "value": ""
  },
  {
    "name": "c",
    "type": "System.Int32",
    "value": ""
  },
  {
   "name": "test",
    "type": "System.String",
    "value": ""
  },
  {
    "name": "f",
    "type": "System.String",
    "value": ""
  }
]

1 Ответ

0 голосов
/ 28 февраля 2020
var myValue = context.DataContext.GetType().GetProperty(p.Name).GetValue(context.DataContext, null);
string_value = myValue.ToString();

можно изменить на

string_value = p.GetValue(context.DataContext) as String;

. Я ранее пробовал этот подход, но пытался создать динамический бросок c, и, очевидно, я никогда не пробовал более простое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...