簡體   English   中英

創建一個方法的DeclaringType實例:Activator.CreateInstance

[英]Create an instance of the DeclaringType of a method: Activator.CreateInstance

我又一次在反思中掙扎。 我只是給你我的調試器不咬的一段代碼:

public bool HandleCommand(string command)
        {
            
            MethodInfo m = methods.FirstOrDefault(t => t.GetCustomAttribute<CommandAttribute>().Name == command);
            ICommandSet set =(m.DeclaringType)Activator.CreateInstance(m.DeclaringType);
            m?.Invoke(set, null);
            return true;
        }

基本上,此代碼位於名為 CommandHandler 的 class 中。 當它被構造時,它會循環執行程序集中實現某個接口的所有類型,並將它們所有附加了 CustomAttribute 的方法存儲在 List 中; 對於這個問題的目的,我只是假設一切都在那里工作。 該屬性只有一個屬性:

[AttributeUsage(AttributeTargets.Method)]
    public class CommandAttribute : Attribute
    {
        public string Name { get; set; }

        public CommandAttribute(string name)
        {
            Name = name;
        }
    }

現在,在您在上面看到的方法中,HandleCommand() 方法中,我存儲的方法的 name 屬性等於我在 MethodInfo m 中傳入的字符串。 現在我的問題本質上是,我如何正確調用此方法。 m.Invoke 需要一個調用它的 object,並且因為傳入“this”不起作用,並且在線示例總是傳入它定義的 class 的實例,我想我需要創建一個 ZA2F2ED4F8EBC2CBB4C21A2 的實例是在中定義並將其傳遞給 Invoke() 方法。 在實踐中,這比我想象的要困難得多,我最好的猜測是你可以在上面看到的,使用激活器。

ICommandSet set =(m.DeclaringType)Activator.CreateInstance(m.DeclaringType);

首先,我確定 m 中聲明的 class 實現了 ICommandSet,因為這是要檢查方法的類型的 creterium。 所以這就是我說“ICommandSet set”的原因。 然后激活器將創建這個實例。 但它不起作用。 提供的唯一錯誤消息指出 m 是一個變量,但用作類型。 但是,當我將它作為參數傳遞給 Activator.CreateInstance() 時,編譯器似乎可以很好地挖掘它。 我絕對不知道如何解決這個問題,因為我真的不明白問題出在哪里。 有沒有人可以幫助我?

另外,所有方法都定義在不同的類甚至項目中,所以我不知道這些方法定義在哪個 class 中。

您收到此消息的原因是您的語法錯誤。 您不能使用變量取消引用作為期望類型來執行強制轉換。 正如您已經知道的那樣,您希望將“set”視為“ICommandSet”強制轉換。

var set = (ICommandSet) Activator.CreateInstance(m.DeclaringType);

你也可以安全地做

var set = Activator.CreateInstance(m.DeclaringType) as ICommandSet;

暫無
暫無

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

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