2014-09-25 1 views
2

На данный момент у меня есть абстрактный класс со свойством этой подписи:Действие словарь ожидать Тип это ключ

protected virtual IDictionary<Type, Action<object>> InitializationMap 
{ 
    get 
    { 
     return null; 
    } 
} 

После продлен, я переопределить его, например, так:

protected override IDictionary<Type, Action<object>> InitializationMap 
{ 
    get 
    { 
     return new Dictionary<Type, Action<object>> 
     { 
      { typeof(INewSchoolWizardExtension), o => ((INewSchoolWizardExtension)o).InitializeWizard(this) }, 
      { typeof(INewSchoolProcessExtension), o => ((INewSchoolProcessExtension)o).Start() } 
     }; 
    } 
} 

Пока он работает, мне действительно не нравится роль литья, он действительно раздувает код.

Что я пытаюсь сделать здесь, это - определить карту инициализации для типов. Так сказать, как только они будут разрешены позже, я бы проверил тип того, что разрешается, и вызовет инициализатор.

Я думал сделать это с помощью дженериков, но не смог никуда добраться.

Как я могу реализовать поведение, так что Action всегда будет ожидать тип его ключа?

+0

Просто из любопытства - ваша собственность является «виртуальной» с тем, что кажется бессмысленной реализацией. Почему бы не сделать его «абстрактным»? – decPL

+0

@decPL, потому что аннотация обязательна, не все классы нуждаются в ней. – jolt

ответ

2

Это вносит небольшую нагрузку, но в остальном функционал:

public class MyInitalizationDictionary : Dictionary<Type, Action<object>> 
{ 
    public void Add<T>(Action<T> action) 
    { 
     this.Add(typeof(T), o => action((T)o)); //said overhead 
    } 
} 

образец инициализатор:

protected override IDictionary<Type, Action<object>> InitializationMap 
{ 
    get 
    { 
     return new MyInitalizationDictionary 
     { 
     (INewSchoolWizardExtension o) => o.InitializeWizard(this), 
     (INewSchoolWizardExtension o) => o.Start() 
     }; 
    } 
} 
+0

Damnit decPL, кроме имени класса, это слово до слова, что я собирался написать: p – Rawling

+1

Да, я пошел к [Леонарду из Кирм] (http://wiki.lspace.org/mediawiki/ index.php/Going-Under-The-Water-Safely_Device), где можно назвать вещи :) – decPL

2

Есть все типы реализовать интерфейс, который инициализирует тип, и требуют, чтобы все из объектов в действиях в этом словаре для реализации этого интерфейса.

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