Enterprise Library - Получить значение из выражения ParameterValue - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь преобразовать ConstructorParameters библиотеки библиотеки предприятия в набор пар ключ / значение (HashTable или IDictionary в целом).

Свойство ConstructorParameters является IEnumerableOf (ParameterValue), поэтому моя проблема заключается в том, как извлечь значения из каждого объекта ParameterValue.

Каждый объект ParameterValue содержит тип и выражение.

Например если ParameterValue содержит: "EventLoggingEnabled = false" тогда я могу получить ключ (который является EventLoggingEnabled), используя expression.Member.Name но я не могу найти способ получить значение («ложное»).

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Вы смотрели на реализацию UnityContainerConfigurator?Даже если вы не хотите использовать Unity, вы можете увидеть, как там обрабатываются средства регистрации типов и адаптироваться к Windsor API.

Как правило, вам не нужно кодировать в необработанный класс ParameterValue и тыкатьчерез лямбда-выражения.На самом деле существует три подкласса:

  • ConstantParameterValue
  • ContainerResolvedParameter
  • ContainerResolvedEnumerableParameter

ConstantParameterValue дает значение непосредственно в качестве значения.имущество.ContainerResolvedParameter используется, когда значение параметра должно быть введено контейнером, а ContainerResolvedEnumerableParameter используется, когда у вас есть коллекция, которую нужно вставить.Каждый экземпляр ParameterValue на самом деле относится к одному из этих типов.

Итак, вы должны попытаться привести к каждому из них, а затем переключиться на основе фактического типа.Есть базовый класс утилит, ParameterValueVisitor, который позволяет вам реализовать шаблон Visitor поверх ParameterValues, чтобы сделать ваш код более чистым.

Итак, что я бы сделал, это отбросил выбор через лямбды - вам не нужно делатьЭто.Реализуйте посетителя для извлечения необходимой вам информации с помощью базового класса, тогда предварительно усвоенная информация будет доступна вам в конкретных классах.Посмотрите на UnityContainerConfigurator для примера того, как это делается.

0 голосов
/ 11 мая 2011

Это работает, когда выражение не ResolvedEnumerable.

    var dependencies = new Hashtable();

        foreach (ParameterValue pv in constructorParameters)
        {
            MemberExpression exp = pv.Expression as MemberExpression;
            if (exp != null)
            {
                String key = exp.Member.Name;
                Object val = GetValue(exp);

                dependencies.Add(key, val);
            }
        }

    // ...

    private Object GetValue(MemberExpression member)
    {
        var objectMember = Expression.Convert(member, typeof(Object));
        var getterLambda = Expression.Lambda<Func<Object>>(objectMember);

        return getterLambda.Compile().Invoke();
    }
...