Получить имя переменной из InArgument

У меня есть пользовательское действие, в котором пользователь выбирает переменную из раскрывающегося списка в повторно размещенной среде дизайнера. Моя проблема в том, что я хочу получить имя переменной вместе с ее значением.
Допустим, у моей пользовательской активности есть "InArgument MyVar{get; set; }". В настоящее время я получаю имя переменной путем анализа "((Microsoft.VisualBasic.Activities.VisualBasicValue)MyVar.Expression).ExpressionText". Есть ли лучший способ?


person Arvand    schedule 08.04.2012    source источник


Ответы (1)


Вы не можете точно знать истинное значение аргумента до времени выполнения.

Но вы можете взять его значение по умолчанию, используя эти методы расширения:

    public static T GetImediateValueOrDefault<T>(Activity<T> activity, ModelItem modelItem)
    {
        if (activity == null)
            return default(T);

        var exprAsLiteral = activity as Literal<T>;
        if (exprAsLiteral != null)
            return exprAsLiteral.Value;

        var exprAsVbValue = activity as Microsoft.VisualBasic.Activities.VisualBasicValue<string>;
        if (exprAsVbValue != null)
            return modelItem.GetDefaultValueOfScopedVariable<T>(exprAsVbValue.ExpressionText);

        return default(T);
    }

    public static T GetDefaultValueOfScopedVariable<T>(this ModelItem modelItem, string variableName)
    {
        IEnumerable<ModelItem> scopedVariables = modelItem.GetScopedVariables();
        ModelItem variableModelItem = scopedVariables.FirstOrDefault(v => Equals(variableName, v.Properties["Name"].ComputedValue));
        if (variableModelItem == null)
            throw new KeyNotFoundException();

        Variable<T> variable = variableModelItem.GetCurrentValue() as Variable<T>;
        if (variable == null)
            return default(T);

        return GetImediateValueOrDefault(variable.Default, modelItem);
    }

Не гарантируется, используйте с осторожностью

person Davi Fiamenghi    schedule 09.04.2012
comment
Видите ли, во время выполнения, когда переменная передается в InArgument, я хочу получить имя передаваемой переменной. - person Arvand; 09.04.2012
comment
@Arvand Вам не нужно значение во время разработки, вам нужно его во время выполнения - это правильно? Просто для пояснения, зачем вам имя переменной во время выполнения? - person Davi Fiamenghi; 09.04.2012
comment
потому что переменные создаются на основе бизнес-логики, поэтому, когда дизайнер открывается, переменные автоматически создаются в файле xaml, и бизнес имеет смысл о переменных, поэтому во время выполнения я передаю словарь ‹string,objects› из моего пользовательская активность для других методов. - person Arvand; 10.04.2012