2015-10-28 130 views
1

我有大量的表單都來自基類FormBase。要激活/告訴他們我用下面的泛型方法:將泛型類型從類型字典傳遞給泛型方法?

public T ShowForm<T>() where T : FormBase, new() 
{ 
    FormBase form = _activeForms.FirstOrDefault(f => f is T); 

    if (form != null) 
     form.BringToFront(); 
    else 
    { 
     form = new T(); 

     IListView view = form as IListView; 
     if (view != null) 
      view.ParentView = this; 

     _activeForms.Add(form); 
     form.MdiParent = this; 
     form.Show(); 
    } 

    return (T)form; 
} 

現在我想用一本字典,這樣我可以輕鬆地添加更多的形式進來,而不必維持一個巨大的switch聲明。

是否有可能有像Dictionary<string, Type>這樣的字典並將Type傳遞給泛型方法?

+0

你需要'詞典<字符串類型>'或'Dictionary '? – qxg

+0

你需要什麼字典? –

+0

我使用了一個相當大的'switch(key)'語句,它使用'key'並基本上將其轉換爲'ShowForm ();'。如果我可以使用字典,我只需要在字典中添加'key'和'typeof(FooForm)'來處理我的代碼中的新窗體。 – w4n

回答

0

在我看來,這是情況下,當泛型方法應換不通用的。考慮以下代碼:

private FormBase ShowForm(Type formType) 
    { 
     FormBase form = _activeForms.FirstOrDefault(f => f.GetType() == formType); 

     if (form != null) 
      form.BringToFront(); 
     else 
     { 
      form = (FormBase)Activator.CreateInstance(formType); 

      IListView view = form as IListView; 
      if (view != null) 
       view.ParentView = this; 

      _activeForms.Add(form); 
      form.MdiParent = this; 
      form.Show(); 
     } 

     return form; 
    } 

    public T ShowForm<T>() where T : FormBase, new() 
    { 
     return (T)ShowForm(typeof(T)); 
    } 

然後,當表單類型是未知的靜態,你可以叫非通用版本的方法:

var form = ShowForm(typeof(SomeForm)); 
+0

非常感謝!這工作正常。看來我在這裏想的太複雜了。如果我只能使用「類型」作爲參數,那麼通用方法並不是真的需要。 – w4n

1

是的,你可以使用反射:

var formType = typeof(SomeForm); // substitute with read from dictionary 

// Get ShowForm<T> 
var showFormMethod = typeof(YourClass).GetMethod("ShowForm"); 

// Convert to ShowForm<SomeForm> 
var showFormMethodSpecific = showFormMethod.MakeGenericMethod(formType); 

// Call method 
var yourClass = new YourClass(); // holder of ShowForm 
object form = showFormMethodSpecific.Invoke(yourClass, null); 

// form is now of type SomeForm 
+0

謝謝!這是一個非常有趣的解決方案,它的作品!不幸的是,在我的第一次測試中,使用反射似乎相當緩慢。 – w4n

+0

你打算如何使用字典?如果我們更瞭解你打算如何處理它,比如你爲什麼擁有它,你打算如何填充它等,那麼也許我可以給你一個更好的解決方案。 –