[英]System.MissingMethodException: Cannot create an instance of an interface
[英]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));
您不能同時創建抽象類和接口的實例。 因為它不包含完整的實現。 所以,首先要實現它。
與大多數語言中的大多數抽象類實現一樣,您無法專門創建該對象。 它用作構建塊,通常用於在其他類之間共享的公共代碼。
執行是正確的。 當您使用接口作為標識符通過反射加載類/對象時,實現該接口的類之一是抽象的,無法使用Activator.CreateInstance
實例化,但您的代碼直到運行時才知道這一點,因為它可以對運行時動態創建的內容進行類型檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.