2016-02-29 68 views
0

有我一個通用的選擇我的界面是這樣的:的反思形式創建實例與通用接口

 public interface IMyInterface{ 
       void ok(); 
     } 

     var maps = (from t in types 
        from i in t.GetInterfaces() 
        where typeof(IMyInterface).IsAssignableFrom(t) && 
          !t.IsAbstract && 
          !t.IsInterface 
        select (IMyInterface)Activator.CreateInstance(t)).ToArray(); 

但我改變了我的接口通用,

 public interface IMyInterface<T>{ 
       void ok<T>(); 
     } 

     var maps = (from t in types 
        from i in t.GetInterfaces() 
        where i.IsGenericType 
         && i.GetGenericTypeDefinition() == typeof(IMyInterface<>) 
         && !t.IsAbstract 
         && !t.IsInterface 
         select ??????????????????????????????? 
        ).ToArray(); 

但現在的鑄造不工作。

 select (IMyInterface<>)Activator.CreateInstance(t)).ToArray(); 

給鑄造造成錯誤。

+0

你的方法聲明是錯誤的,太糟糕了,你省略了它。它必須是T型通用的。然後使用'IMyInterface '而不是IMyInterface <>。 IMyInterface和T都需要在兩個項目引用的程序集中聲明。相當不可能是一個正確的方法。 –

回答

0

IMyInterface<T>不是 a IMyInterface<>,因此演員表無效。編譯器只是保護你不會在運行時發現這個問題,因爲你可以在C#中使用從來沒有有類型GenericType<>的值 - 非泛化泛型類型只用於反射。

請注意如何typeof(IMyInterface<>).IsAssignableFrom(typeof(IMyInterface<string>))返回false。這兩種類型是完全不同的,只有一個共同的通用定義,與List<int>List<string>相同是兩種不同的類型,它們只有一個共同的通用定義。 C#泛型不是Java泛型。

沒有可用於包含List<string>List<int>的常用類型,就像您可以用於IMyInterface<A>IMyInterface<B>的不常見類型一樣。要麼確保所有東西都是通用的,要麼製作另一個非通用的接口,並且IMyInterface<T>實現。

+0

@bookmarker這並沒有改變任何東西。你仍然試圖投射到「不是真正的類型」類型。 – Luaan