2012-06-01 2 views
0

Итак, я начал без знаний об отражении или динамическом наборе текста, но я многому научился. Однако есть одна вещь, которую я не могу найти: эквивалент «как» для динамического набора.«как» эквивалент с использованием отражения

То, что я пытаюсь сделать, это эквивалент этого (если он будет компилировать):

foreach (Change c in changes) 
{ 
    (c.Undo as Action<c._Type, c._Type>).Invoke(
     c.OldValue as c._Type, c.NewValue as c._Type); 
} 

Из того, что я понимаю, что мне нужно сделать что-то вдоль линий

Type constructedClass = typeof(Action<,>).MakeGenericType(c._Type); 

, чтобы построить необходимый класс Action, но есть ли способ реализовать as как для типа Action, так и для c._Type?

Для дальнейшего уточнения, здесь псевдокод (и это мой первый раз пытается сделать такого рода вещи, поэтому, пожалуйста, быть хорошим):

foreach (Object o in objects) 
{ 
    (o.SettableMethod as Action<o.TypeOfParameters, o.TypeOfParameters>).Invoke(
     o.Parameter1 as TypeOfParameters, o.Parameter2 as TypeOfParameters); 
} 

Спасибо заранее.

+2

Непонятно, что вы хотите дать пример использования –

+0

Причина немного сложная, но я храню c.Undo (который должен быть Action ) как объект, а также его OldValue и NewValue. Я пытаюсь назначить их соответствующие типы. Там есть куча другого кода, и я не знаю, что было бы полезно .... – benjer3

+0

Просто отправьте образец в псевдокоде того, что вы пытаетесь сделать –

ответ

1

Назначение дженериков в действии (или вообще) заключается в том, чтобы вы могли управлять безопасностью типа во время компиляции. Если вы используете отражение, вы делаете дополнительную работу до , а не получите эту выгоду. У вас также может быть подпись вашего действия Undo для двух объектов типа object и при необходимости применять к соответствующим типам внутри действия.

Даже в более общем плане вам будет лучше обслуживаться другой дизайн. Почему вы вызываете метод на Change, который отправляет свойства Change? Не могли бы вы вызвать Undo без каких-либо параметров и оставить Change ответственным за то, что знаете, что такое новые и старые значения?

+0

Другой дизайн может быть полезным, но это единственный способ Я могу подумать об этом. То, что я пытаюсь сделать, - это создать набор классов, которые могут обрабатывать отмену и повторение без необходимости создания огромного массива классов для каждого возможного типа. Конечно, разные типы заставляют вас думать о дженериках, но у меня проблемы с контравариантностью и попытки обойти это. c.Undo - это метод, который я даю c как параметр для определения того, как он должен отменять каждое изменение. У него нет определения; Я даю ему определение, когда я делаю объект Change. – benjer3

+0

У вас все еще есть подпись, чтобы взять два объекта. Вот как все эти методы использовались для всех, прежде всего, перед дженериками; дженерики были добавлены, чтобы облегчить безопасность типов. Таким образом, вы не получаете безопасности типов. – tallseth

+0

Нужно ли отменить что-то, кроме замены newVal на oldVal? Другой дизайн должен был сделать это. Это означает, что ваша работа Undo против объекта Memento содержит всю интересную информацию о состоянии, которую вы хотите изменить. – tallseth

Смежные вопросы