簡體   English   中英

System.MissingMethodException:無法創建抽象類

[英]System.MissingMethodException: Cannot create an abstract class

擴展命令管理器.cs

var assembly = AppDomain.CurrentDomain.GetAssemblies();
var types = assembly.SelectMany(s => s.GetTypes()).Where(p => typeof(ICommand).IsAssignableFrom(p));
foreach (var type in types)
{
   source.Commands.Add((ICommand) Activator.CreateInstance(type)); 
}

return source; 

類型繼承ICcommand 但是為什么會出現錯誤呢?

錯誤

Unhandled exception. System.MissingMethodException: Cannot create an abstract class.
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean wrapExceptions, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& hasNoDefaultCtor)
   at System.RuntimeType.CreateInstanceDefaultCtorSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type)
   at BASE.CommandControllers.ExtendedCommandManager.Load[T](T source) in D:\CLang\DicordProject\Discord\BASE\CommandControllers\ExtendedCommandManager.cs:line 16

但是為什么會出現錯誤呢?

因為您正在嘗試創建抽象類的實例(而不是從該抽象類派生的具體類)。 你不能用反射來做到這一點,就像你不能用常規代碼那樣。 如果您嘗試編寫var command = new FooCommand(); (其中FooComand是它失敗的類型)該代碼將無法編譯。

檢查要實例化哪些類型的代碼應包含!p.IsAbstract以過濾掉實現ICommand抽象類。

錯誤告訴您究竟出了什么問題。 您不能創建抽象類的實例。

您需要過濾您的類型,以便它們不包含抽象類型。 像這樣:

var types = assembly.SelectMany(s => s.GetTypes()).Where(p => !p.IsAbstract && typeof(ICommand).IsAssignableFrom(p));

您不能同時創建抽象類和接口的實例。 因為它不包含完整的實現。 所以,首先要實現它。

請參閱此Microsoft Doc 以供參考

與大多數語言中的大多數抽象類實現一樣,您無法專門創建該對象。 它用作構建塊,通常用於在其他類之間共享的公共代碼。

執行是正確的。 當您使用接口作為標識符通過反射加載類/對象時,實現該接口的類之一是抽象的,無法使用Activator.CreateInstance實例化,但您的代碼直到運行時才知道這一點,因為它可以對運行時動態創建的內容進行類型檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM