Вы можете создать атрибут, имеющий одно свойство, которое будет иметь тип CheckoutContext:
public class CheckoutContextAttribute : Attribute
{
public Type CheckoutType{get;set;}
}
Затем в вашем перечислении вы можете указать правильный атрибут для правильного типа перечисления:
public enum CheckoutCase
{
[CheckoutContext(CheckoutType=typeof(SingleItemNew)]
SingleItemNew,
...
...
}
Затем в этом методе, где вам нужно отправить обратно правильный тип контекста, вы используете отражение и делаете что-то вроде этого:
public CheckoutContext GetContext(CheckoutCase c)
{
FieldInfo field = c.GetType().GetField(c.ToString());
object[] attribs = field.GetCustomAttributes(typeof(CheckoutContextAttribute),false);
CheckountContext result = null;
if(attribs.Length > 0)
{
CheckoutContextAttribute attrib = attribs[0] as CheckoutContextAttribute;
Type type = attrib.CheckoutType;
result = Activator.CreateInstance(type) as CheckountContext;
}
return result;
}
Это должно сработать. Просто добавьте проверку нуля / ошибок, чтобы быть в безопасности.